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

To Clarify my insights to copy initialization and direct initialization

提问人:Finley 提问时间:7/18/2018 最后编辑:Finley 更新时间:7/18/2018 访问量:41

问:

按如下方式定义类:

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)

C++ 初始 构造函数 复制 初始化

评论


答:

0赞 songyuanyao 7/18/2018 #1

直接初始化复制初始化之间是有区别的:

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

因此,如果您制作复制构造函数,则将不起作用;虽然仍然工作正常。explicitA a3 = a1A a2(a1)

评论

0赞 Finley 7/18/2018
那么,我对大小写的理解是否正确,没有任何编译器优化?A a4 = "Hello"
0赞 songyuanyao 7/18/2018
@Finley 是的,没错。通过优化,通常会优化复制构造函数。
0赞 M.M 7/18/2018
@Finley 由于 C++17 与 完全相同,除了检查A a4 = "Hello";A a4("Hello");explicit