C ++初始化何时仅使用复制构造函数,何时使用复制构造函数和赋值运算符

时间:2018-10-19 17:58:02

标签: c++

我已经读过C ++入门读物,那就是

  实现可以选择分两步处理该语句:使用复制构造函数创建一个临时对象,然后使用赋值将值复制到新对象。也就是说,初始化总是调用复制构造函数,然后使用=运算符还可以调用赋值运算符

我还在一些网站上读到说A a2 = a1;之类的代码与A a2(a1);相同,这意味着A a2 = a1仅调用复制构造函数。

所以我的问题是,当程序仅使用复制构造函数且同时使用复制构造函数和赋值运算符时。谁来决定,是编译器吗?

1 个答案:

答案 0 :(得分:6)

诸如

的C ++初始化语句
A a2 = a1;

切勿使用重载的赋值运算符。

只有这样的语句

A a2; // Default construction
a2 = a1; // Applying assignment

将永远使用赋值运算符。

区别在于,如果在完成变量定义的同一行中看到=(类型位于前面),编译器将其视为 initialization ,并且不是分配

复制构造函数和赋值运算符永远不会同时使用。

  
    实现可以选择分两步处理该语句:使用复制构造函数创建一个临时对象,然后使用赋值将值复制到新对象。也就是说,初始化总是调用复制构造函数,然后使用=运算符还可以调用赋值运算符

  

您的书对此可能是错误的(至少我从未注意到有任何编译器实现如此工作),或者您从上下文中误解了该语句。