澄清我对复制初始化和直接初始化的见解

时间:2018-07-18 01:57:55

标签: c++ initialization copy-constructor copy-initialization

定义一个类,如下所示:

class A {
public:
  A(): s("") {}                             //default constructor
  A(const char* pStr): s(pStr) {}           //constructor with parameter
  A(const A& a) : s(a.s) {}                 //copy constructor
  ~A() {}                                   //destructor
private:
  std::string s;
};

下面的代码将执行直接初始化:

A a1("Hello!");   //direct initialization by calling constructor with parameter
A a2(a1);          //direct initialization by calling copy constructor

接下来将执行副本初始化:

A a3 = a1;  
A a4 = "Hello!";

据我了解,A a4 = "Hello"等同于:

//create a temporary object first, then "copy" this temporary object into a4 by calling copy constructor    
A temp("Hello!");    
A a4(temp);

那么A a3 = a1A a2(a1)有什么区别?看来他们都调用了副本构造函数。我上面的评论是否正确? (不进行编译器优化)

1 个答案:

答案 0 :(得分:0)

direct-initializationcopy-initialization之间是有区别的:

  

复制初始化比直接初始化要宽松:显式构造函数不会转换构造函数,因此不会考虑进行复制初始化。

因此,如果您使复制构造函数为explicit,则A a3 = a1将不起作用;而A a2(a1)仍然可以正常工作。