在 「C++ Primier」中作者告诉我们复制构造函数的调用时机有下列几种:
- 当用一个类对象去初始化另外一个类对象(类似于 AClass aInstance = bInstance),这里不是调用赋值构造函数(也叫赋值重载运算符)。复制是说初始化,赋值是初始化后重新覆盖旧值
- 函数形参是类对象
- 函数返回值为对象,函数执行完返回时会生成一个临时对象,将值复制给临时对象
但第 3 条验证时发现并不调用复制构造函数。
#include <iostream>
using namespace std;
class CTest
{
public:
CTest(){}
~CTest(){ }
CTest(const CTest &test)
{
cout<<"copy constructor."<<endl;
}
void operator=(const CTest &test)
{
cout<<"operator="<<endl;
}
void Test(CTest test)
{}
CTest Test2()
{
CTest a;
return a;
}
void Test3(CTest &test)
{}
CTest &Test4()
{
CTest *pA = new CTest;
return *pA;
}
};
int main()
{
CTest obj;
CTest obj2;
obj2 = obj.Test2();
return 0;
}
结果打印
operator=
相当于 obj2 =
这一步的 = 调用了重载运算符函数
编译选项改为 g++ test.cpp -o test -fno-elide-constructors
结果打印
copy constructor.
operator=
这里被 GCC 优化,返回值为对象时,不再产生临时对象,因而不再调用复制构造函数。
参考
http://blog.csdn.net/sxhelijian/article/details/50977946