拷贝构造函数和赋值操作符operator=分别在什么时候被调用?

本文通过一个简单的C++示例程序说明了拷贝构造函数与赋值操作的区别及其实现细节。展示了不当使用这两者可能导致的问题,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. // cctest.cpp: Simple program to illustrate a problem calling 
  2. // operator= from copy constructor. This can result in member 
  3. // objects getting initialized twice. To compile: cl cctest.cpp
  4. //
  5. #include <stdio.h>
  6. //#define GOOD
  7. //////////////////
  8. // Class used as member of main class.
  9. //
  10. class CMember {
  11. public:
  12.    CMember()
  13.    {
  14.       printf(" CMember: default ctor/n");
  15.    }
  16.    CMember(const CMember&)
  17.    {
  18.       printf(" CMember: copy-ctor/n");
  19.    }
  20.    CMember& operator=(const CMember&) {
  21.       printf(" CMember: operator=/n");
  22.       return *this;
  23.    }
  24. };
  25. //////////////////
  26. // Main class
  27. //
  28. class CMainClass {
  29. protected:
  30.    CMember m_obj;
  31. public:
  32.    CMainClass()
  33.    {
  34.       printf(" CMainClass: default ctor/n");
  35.    }
  36. #ifndef GOOD
  37.    // Copy-ctor calls operator=. This is not generally recommended.
  38.    //
  39.    CMainClass(const CMainClass& rhs)
  40.    {
  41.       printf(" CMainClass: copy-ctor/n");
  42.       *this = rhs;
  43.    }
  44. #else
  45.    // Below is a better way to initialize m_obj.
  46.    //
  47.    CMainClass(const CMainClass& rhs) : m_obj(rhs.m_obj)
  48.    {
  49.       printf(" CMainClass: copy-ctor/n");
  50.    }
  51. #endif
  52.    CMainClass& operator=(const CMainClass& rhs)
  53.    {
  54.       printf(" CMainClass: operator=/n");
  55.       m_obj = rhs.m_obj;
  56.       return *this;
  57.    }
  58. };
  59. int main()
  60. {
  61.    printf("Creating instance with default ctor:/n");
  62.    CMainClass obj1;
  63.    printf("Creating instance with copy-ctor:/n");
  64.    CMainClass obj2 = obj1;
  65.    printf("Performing assignment:/n");
  66.    obj2 = obj1;
  67. }

看看上面的代码,最终输出结果是什么呢?

 

规则:

在 C++ 中,赋值和拷贝是不同的,

拷贝构造函数是对未初始化的内存进行初始化操作

而赋值是对现有的已经初始化的对象进行操作。(这里我对“已经初始化”的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可)

 

结果出炉:

Creating instance with default ctor:
 CMember: default ctor
 CMainClass: default ctor
Creating instance with copy-ctor:
 CMember: default ctor
 CMainClass: copy-ctor
 CMainClass: operator=
 CMember: operator=
Performing assignment:
 CMainClass: operator=
 CMember: operator=

 

知道为什么会这样了吗?

http://www.vckbase.com/document/viewdoc/?id=1532

 

一些相关文章

http://www.cppblog.com/mzty/archive/2008/04/02/45998.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值