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

本文参照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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值