c++基础:拷贝初始化和直接初始化的误区
来源:互联网 发布:人工智能 书籍 编辑:程序博客网 时间:2024/05/22 17:20
本文参照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=(这个显而易见)
0 0
- c++基础:拷贝初始化和直接初始化的误区
- 直接初始化和拷贝初始化
- 直接初始化和拷贝初始化
- C++ 直接初始化和拷贝初始化
- C++误区——直接初始化和复制初始化
- C++中string和char的区别以及直接初始化和拷贝初始化
- 复制初始化和直接初始化的区别
- C/C++数组初始化的一些误区
- C/C++数组初始化的一些误区
- 直接初始化与拷贝初始化学习笔记
- 直接初始化与拷贝(复制)初始化
- 直接初始化与拷贝(复制)初始化
- 直接初始化和复制初始化
- 直接初始化和复制初始化
- 复制初始化和直接初始化
- c/c++数组初始化误区
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- C++的一大误区——深入解释直接初始化与复制初始化的区别
- JAVA比较日期前后的方法
- nyoj 1282 部分和问题(入门题)(dfs)
- GMock
- Java面试-进阶(二)
- 正则表达式
- c++基础:拷贝初始化和直接初始化的误区
- 我的编号
- centos7 install caffe
- 机器学习笔记(十)EM算法及实践(以混合高斯模型(GMM)为例来次完整的EM)
- Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
- linux执行sh脚本报错的解决办法
- Maven学习笔记(二)
- 100亿数据平滑数据迁移,不影响服务
- Codeforces #406 (Div. 2) B. Bear and Friendship Condition(并查集