C++之拷贝构造、赋值构造必须为引用?
来源:互联网 发布:电影院一些数据 编辑:程序博客网 时间:2024/05/16 05:42
转载自C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝。然而今天看到一篇文章发现自己对拷贝构造的参数理解有误。 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导致栈溢出。
class test{public: test() { cout << "constructor with argument\n"; } ~test() { } test(test& t) { cout << "copy constructor\n"; } test&operator=(const test&e) { cout << "assignment operator\n"; return *this; }};int _tmain(int argc, _TCHAR* argv[]){ test ort; test a(ort); test b = ort ; a = b; return 0;}
输出结果:
如果复制构造函数是这样的 :
test(test t);
我们的执行过程是:
//test ort;//test a(ort); --> test.a(test t=ort)==test.a(test t(ort))// -->test.a(test t(test t = ort))// ==test.a(test t(test t(ort)))// -->test.a(test t(test t(test t=ort)))// ...// 就这样会一直无限递归下去。
到这里,我们也就明白了,为什么拷贝构造函数的参数一定要为引用,不能为值传递的原因了。
接下来,我们再测试一下赋值构造函数的参数,如果我们把它的参数也改为值传递,做一个测试。
class test{public: test() { cout << "constructor with argument\n"; } ~test() { } test(test& t) { cout << "copy constructor\n"; } test&operator=(test e) { cout << "assignment operator\n"; return *this; }};int _tmain(int argc, _TCHAR* argv[]){ test ort; test a(ort); test b = ort ; a = b; return 0;}
输出结果为:
赋值构造函数如果为值传递,仅仅是多了一次拷贝,并不会无限递归。
总结
拷贝构造函数的参数必须为引用。赋值构造函数参数既可以为引用,也可以为值传递,值传递会多一次拷贝。因此建议赋值构造函数建议也写为引用类型。(CKK看 刚才我的理解还是有偏差:左右值不是关键,减少拷贝次数提高赋值效率是重点)
阅读全文
0 0
- C++之拷贝构造、赋值构造必须为引用?
- 构造、拷贝构造、赋值
- 拷贝构造 赋值构造
- C++之拷贝构造与拷贝赋值
- 拷贝构造和赋值构造
- 【C++】拷贝构造函数和赋值函数
- 为什么拷贝构造函数必须为引用传递,不能是值传递?
- 为什么拷贝构造函数必须为引用传递,不能是值传递?
- 为什么拷贝构造函数必须为引用传递,不能是值传递?
- 为什么拷贝构造函数必须为引用传递,不能是值传递?
- c++_7: 拷贝构造函数和赋值构造函数
- C ++ 拷贝构造函数和赋值构造函数 非常经典
- 构造&转换&拷贝&赋值
- C++之拷贝构造函数和赋值构造函数
- 【C++】C++中拷贝构造函数的参数类型必须是引用
- 拷贝,赋值构造函数赋值
- 拷贝构造和拷贝赋值
- 拷贝构造与拷贝赋值
- 莫烦大神推荐的学习机器学习路线以及对应链接 转来学
- eclipse代码自动提示,eclipse设置代码自动提示
- 今晚回去必做的事情
- Minimum Moves to Equal Array Elements(leetcode)
- python 将txt 表格转化为excel
- C++之拷贝构造、赋值构造必须为引用?
- MemQ 实现异步任务
- android studio 报Error:failed to find Build Tools revision 21.0.0
- C++和C语言中enum 如何使用
- 记录网上查到的影响因子说明
- 程序员的自我修养第二章总结
- Ubuntu备份与恢复
- HashMap与HashTable(二)-HashMap原理与实现
- 杭电acm2111 Saving HDU