c++基础:拷贝初始化和直接初始化的误区
2017-03-24 12:38
232 查看
本文参照csdn博客http://blog.csdn.net/ljianhui/article/details/9245661
例子也来自此文章,我将之归纳总结,更为简洁地表达:
首先大多数人却认为,直接初始化是构造对象时要调用复制构造函数,而复制初始化是构造对象时要调用赋值操作函数(operator=),其实这是一大误解。
实际上是编译器编译时对程序进行优化而产生的误解。
我们直接看代码:
如此编译运行的结果是
而把代码中的第24行取消注释 得出的结果:
却是编译错误
个中原因可以参照我的总结进行推想,详细可见上面网址
总结:
①含有“=”的运行分为两步:先生成一个对象(可能为临时对象),再把对象复制。
②系统会进行代码优化:因为系统默认生成:复制构造函数ClassTest(const ClassTest& ct) 且 原来为public,就把两步变成一步,直接优化成没有“=”的
③所以把复制构造函数ClassTest(const ClassTest& ct)变成private系统就不会进行优化了,因为你拒绝了系统的优化。
④整个过程都没有用到赋值操作函数operator=(这个显而易见)
例子也来自此文章,我将之归纳总结,更为简洁地表达:
首先大多数人却认为,直接初始化是构造对象时要调用复制构造函数,而复制初始化是构造对象时要调用赋值操作函数(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++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- c++基础:拷贝初始化和直接初始化的误区
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- C++误区——直接初始化和复制初始化
- c++拷贝初始化和直接初始化的底层区别
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- C++ 直接初始化和拷贝初始化
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- 【原创】c++拷贝初始化和直接初始化的底层区别
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- C++的一大误区——深入解释直接初始化与复制初始化的区别