您的位置:首页 > 编程语言 > C语言/C++

c++基础:拷贝初始化和直接初始化的误区

2017-03-24 12:38 232 查看
本文参照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=(这个显而易见)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 编译器 初始化