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

  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

你可能感兴趣的:(c)