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
原创粉丝点击