• C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?


    之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝。然而今天看到一篇文章发现自己对拷贝构造的参数理解有误。 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导致栈溢出。

        下面来看一个例子:
    1. class test
    2. {
    3. public:
    4. test()
    5. {
    6. cout << "constructor with argument ";
    7. }
    8. ~test()
    9. {
    10. }
    11. test(test& t)
    12. {
    13. cout << "copy constructor ";
    14. }
    15. test&operator=(const test&e)
    16. {
    17. cout << "assignment operator ";
    18. return *this;
    19. }
    20. };
    21. int _tmain(int argc, _TCHAR* argv[])
    22. {
    23. test ort;
    24. test a(ort);
    25. test b = ort ;
    26. a = b;
    27. return 0;
    28. }
    输出:
    如果这些知识你都能理解。下面就来解释一下为什么值传递会无限递归!
    如果复制构造函数是这样的 : 
    1. test(test t);
    我们调用
    1. test ort;
    2. test a(ort); --> test.a(test t=ort)==test.a(test t(ort))
    3. -->test.a(test t(test t = ort))
    4. ==test.a(test t(test t(ort)))
    5. -->test.a(test t(test t(test t=ort)))
    6. ...
    7.     就这样会一直无限递归下去。
    到这里,我们也就明白了,为什么拷贝构造函数的参数一定要为引用,不能为值传递的原因了。
     
    接下来,我们再测试一下赋值构造函数的参数,如果我们把它的参数也改为值传递,做一个测试。
    1. class test
    2. {
    3. public:
    4. test()
    5. {
    6. cout << "constructor with argument ";
    7. }
    8. ~test()
    9. {
    10. }
    11. test(test& t)
    12. {
    13. cout << "copy constructor ";
    14. }
    15. test&operator=(test e)
    16. {
    17. cout << "assignment operator ";
    18. return *this;
    19. }
    20. };
    21. int _tmain(int argc, _TCHAR* argv[])
    22. {
    23. test ort;
    24. test a(ort);
    25. test b = ort ;
    26. a = b;
    27. return 0;
    28. }
    输出:
    赋值构造函数如果为值传递,仅仅是多了一次拷贝,并不会无限递归。
     
    总结:拷贝构造函数的参数必须为引用。赋值构造函数参数既可以为引用,也可以为值传递,值传递会多一次拷贝。因此建议赋值构造函数建议也写为引用类型。(CKK看 刚才我的理解还是有偏差:左右值不是关键,减少拷贝次数提高赋值效率是重点)
  • 相关阅读:
    神秘人物之comca —— 是否就是我的前车之鉴
    mfc错误:其原因可能是堆被损坏,这说明**.exe中或它加载的任何DLL
    微信公共平台php用$GLOBALS["HTTP_RAW_POST_DATA"]收不到信息解决方法
    2013蓝桥杯初赛c语言专科组题目与答案
    一道2012腾讯实习生笔试题
    文件版权自动注释,自动备份
    算法学习 三 >> 认识算法的效率(循环设计)
    算法学习 二 >> 结构化与面向对象两种算法设计的简略分析(c++/java)
    HTML入门(一)
    算法学习 一 >> 初识
  • 原文地址:https://www.cnblogs.com/zsq1993/p/6110773.html
Copyright © 2020-2023  润新知