html5中文学习网

您的位置: 首页 > 网站及特效实例 > jquery特效 » 正文

c++怎样让返回对象的函数不调用拷贝构造函数_编程语言综合

[ ] 已经帮助:人解决问题

  我们知道拷贝构造函数有两种“默默”的方式被调用m9XHTML5中文学习网 - HTML5先行者学习网

1. 想函数传入 值参数m9XHTML5中文学习网 - HTML5先行者学习网

2. 函数返回 值类型m9XHTML5中文学习网 - HTML5先行者学习网

今天我们讨论函数返回值类型的情况。m9XHTML5中文学习网 - HTML5先行者学习网

得到结论是m9XHTML5中文学习网 - HTML5先行者学习网

1. 当对象有拷贝构造函数(系统为我们生成、或者我们自己写拷贝构造函数)可以被隐式调用时,函数返回时会使用拷贝构造函数。m9XHTML5中文学习网 - HTML5先行者学习网

2. 当对象的拷贝构造函数声明成为explicit(不能被隐式调用时),函数返回时会使用move构造函数。m9XHTML5中文学习网 - HTML5先行者学习网

先看开始的代码。m9XHTML5中文学习网 - HTML5先行者学习网

#include <iostream>#include <memory>using namespace std;class Thing{public:	int		member_;	Thing():member_(0){  //默认构造函数	}	Thing(Thing& other):member_(other.member_){//拷贝构造函数			cout << "copy" << endl;	}		Thing(Thing&& other):member_(other.member_){//move构造函数		cout << "move" << endl;	}};Thing getThingByReturnValue(){	Thing thing;	thing.member_ = 1;	cout << "in method /t" <<  &thing.member_ << endl;	return thing;//会调用到拷贝构造函数}unique_ptr<int> getBySmartPtr(){	unique_ptr<int> p(new int);	cout << "in method /t" << *p << endl;//注意unique_ptr已经重载了*操作符,实际输出的是裸指针的内存地址	return p;//会调用unique_ptr move构造函数}void main(){	Thing th  = getThingByReturnValue();	cout << "out method /t" << &th.member_ << endl;	auto p = getBySmartPtr();	cout << "out method /t" << *p << endl;//注意unique_ptr已经重载了*操作符,实际输出的是裸指针的内存地址}/*in method       003CF798copyout method      003CF88C  //可见getThingByReturnValue调用的是Thing的copy构造函数in method       -842150451out method      -842150451  //可见getBySmartPtr调用的是unique_ptr的move构造函数请按任意键继续. . .*/

为什么我们写的类会调用copy,而unique_ptr会调用move??百思不得其解。。睡觉时想到了,explicit修饰构造函数的用法。给拷贝构造函数加上explicit试试。m9XHTML5中文学习网 - HTML5先行者学习网

explicit Thing(Thing& other):member_(other.member_){//拷贝构造函数	cout << "copy" << endl;}/*in method       003EFC18moveout method      003EFD0Cin method       -842150451out method      -842150451请按任意键继续. . .*/
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助