经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
类的构造函数学习笔记:显式调用构造函数生成临时对象,拷贝构造函数
来源:cnblogs  作者:放不下的小女孩  时间:2021/4/19 9:00:59  对本文有异议

  在学习《C++primer 第五版》(中文版)中第七章类的时候遇到了一个有意思的习题,原题如下:

  1. 练习7.43:假定有一个名为NoDefault的类,它有一个接受int的构造函数,但是没有默认的构造函数。定义类CC有一个Nodefault类型成员,定义C的默认构造函数

  本题的答案很简单,直接利用初始化列表给成员类提供一个默认参数即可,参考答案如下:

  1. struct Nodefault
  2. {
  3. private:
  4. int x;
  5. public:
  6. Nodefault(int y){};
  7. };
  8. struct C
  9. {
  10. private:
  11. Nodefault no;
  12. public:
  13. C() :no(1) {};
  14. };

  但是当时想利用一个为所有参数都提供默认实参的构造函数来等价定义默认函数,于是将C的构造函数改为下式:

  1. C(Nodefault x= Nodefault(1)) :no(x) {};

  初看这个构造函数的时候非常难以理解,本能的会将此行代码理解为:调用构造函数Nodefault(int)将其返回值当成x的默认初始值并利用列表初始化提供成员类no的初始值。这样理解有两个问题:

首先是构造函数是一个没有返回值的特殊函数,其次没有返回值的构造函数无法给"="提供一个有效的右值

  显然这样的理解是错误的,正确的执行流程应该是:

  1、显式调用类Nodefault的构造函数Nodeafult(int),生成一个类的临时对象

  2、调用拷贝构造函数将临时对象拷贝给类C的成员类no(只调用一次拷贝构造函数)

  验证代码如下:

  1. struct Nodefault
  2. {
  3. private:
  4. int x;
  5. public:
  6. Nodefault(int y)
  7. {
  8. cout << "consttuction for Nodefault" << endl;
  9. };
  10. Nodefault(const Nodefault &c)
  11. {
  12. x = c.x;
  13. cout << "copy construction" << endl;
  14. }
  15. ~Nodefault() { cout << "deconstruction for Nodefault" <<endl; }
  16. };
  17. struct C
  18. {
  19. private:
  20. Nodefault no;
  21. public:
  22. C(Nodefault x= Nodefault(1)) :no(x){
  23. cout << "consttuction for C" << endl;
  24. };
  25. ~C() { cout << "deconstruction for C" << endl; }
  26. };
  27. int main()
  28. {
  29. C object;
  30. return 0;
  31. }

 

  输出结果如下:

  1. 1 consttuction for Nodefault
  2. 2 copy construction
  3. 3 consttuction for C
  4. 4 deconstruction for Nodefault
  5. 5 deconstruction for C
  6. 6 deconstruction for Nodefault

 

  注意:1、只调用一次拷贝构造函数,临时对象直接拷贝给成员类。

     2、两次调用类Nodefault的析构函数:第一次在C对象构造函数结束时析构临时对象Nodefault、第二在程序结束时自动析构C后析构成员类Nodefaul

原文链接:http://www.cnblogs.com/wildricky/p/14657306.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号