本文参照csdn博客http://blog.csdn.net/ljianhui/article/details/9245661
例子也来自此文章,我将之归纳总结,更为简洁地表达:
首先大多数人却认为,直接初始化是构造对象时要调用复制构造函数,而复制初始化是构造对象时要调用赋值操作函数(operator=),其实这是一大误解。
实际上是编译器编译时对程序进行优化而产生的误解。
我们直接看代码:
#include <iostream>
#include <cstring>
using namespace std;
class ClassTest
{
public:
ClassTest()
{
c[0] = '\0';
cout<<"ClassTest()"<<endl;
}
ClassTest& operator=(const ClassTest &ct)
{
strcpy(c, ct.c);
cout<<"ClassTest& operator=(const ClassTest &ct)"<<endl;
return *this;
}
ClassTest(const char *pc)
{
strcpy(c, pc);
cout<<"ClassTest (const char *pc)"<<endl;
}
// private:
ClassTest(const ClassTest& ct)
{
strcpy(c, ct.c);
cout<<"ClassTest(const ClassTest& ct)"<<endl;
}
private:
char c[256];
};
int main()
{
cout<<"ct1: ";
ClassTest ct1("ab");//直接初始化
cout<<"ct2: ";
ClassTest ct2 = "ab";//复制初始化
cout<<"ct3: ";
ClassTest ct3 = ct1;//复制初始化
cout<<"ct4: ";
ClassTest ct4(ct1);//直接初始化
cout<<"ct5: ";
ClassTest ct5 = ClassTest();//复制初始化
return 0;
}
如此编译运行的结果是
而把代码中的第24行取消注释 得出的结果:
却是编译错误
个中原因可以参照我的总结进行推想,详细可见上面网址
总结:
①含有“=”的运行分为两步:先生成一个对象(可能为临时对象),再把对象复制。
②系统会进行代码优化:因为系统默认生成:复制构造函数ClassTest(const ClassTest& ct) 且 原来为public,就把两步变成一步,直接优化成没有“=”的
③所以把复制构造函数ClassTest(const ClassTest& ct)变成private系统就不会进行优化了,因为你拒绝了系统的优化。
④整个过程都没有用到赋值操作函数operator=(这个显而易见)