- // cctest.cpp: Simple program to illustrate a problem calling
- // operator= from copy constructor. This can result in member
- // objects getting initialized twice. To compile: cl cctest.cpp
- //
- #include <stdio.h>
- //#define GOOD
- //////////////////
- // Class used as member of main class.
- //
- class CMember {
- public:
- CMember()
- {
- printf(" CMember: default ctor/n");
- }
- CMember(const CMember&)
- {
- printf(" CMember: copy-ctor/n");
- }
- CMember& operator=(const CMember&) {
- printf(" CMember: operator=/n");
- return *this;
- }
- };
- //////////////////
- // Main class
- //
- class CMainClass {
- protected:
- CMember m_obj;
- public:
- CMainClass()
- {
- printf(" CMainClass: default ctor/n");
- }
- #ifndef GOOD
- // Copy-ctor calls operator=. This is not generally recommended.
- //
- CMainClass(const CMainClass& rhs)
- {
- printf(" CMainClass: copy-ctor/n");
- *this = rhs;
- }
- #else
- // Below is a better way to initialize m_obj.
- //
- CMainClass(const CMainClass& rhs) : m_obj(rhs.m_obj)
- {
- printf(" CMainClass: copy-ctor/n");
- }
- #endif
- CMainClass& operator=(const CMainClass& rhs)
- {
- printf(" CMainClass: operator=/n");
- m_obj = rhs.m_obj;
- return *this;
- }
- };
- int main()
- {
- printf("Creating instance with default ctor:/n");
- CMainClass obj1;
- printf("Creating instance with copy-ctor:/n");
- CMainClass obj2 = obj1;
- printf("Performing assignment:/n");
- obj2 = obj1;
- }
看看上面的代码,最终输出结果是什么呢?
规则:
在 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
一些相关文章