【问题标题】:when does a C++ initialization use only copy constructor and when does it use both copy constructor and assignment operatorC++ 初始化何时仅使用复制构造函数,何时同时使用复制构造函数和赋值运算符
【发布时间】:2018-10-19 17:58:01
【问题描述】:

我已经读过 C++ 入门书,而且就是这么说的

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

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

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

【问题讨论】:

标签: c++


【解决方案1】:

C++ 初始化语句,如

A a2 = a1;

永远不要使用重载的赋值运算符。

只有像这样的语句

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

永远会使用赋值运算符。

不同之处在于,如果您在完成变量定义的同一行中看到=(类型在前面),则编译器将其视为初始化,而不是任务。

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

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

您的书可能对此有误(至少我从未注意到任何编译器实现以这种方式工作),或者您从上下文中误解了该陈述。

【讨论】:

  • 我很好奇像A a2 = *(new A(a1))这样的临时案例会发生什么?
  • @JohnCvelth 你认为这有什么关系?您的示例仍然没有完成任何任务。
  • “同一行”与此无关。 C++ 不在乎你的源代码中有什么样的空白。 A a2; a2 = a1; 是单行赋值。
  • @JohnCvelth 无论如何都没有移动初始化问题。
  • @JohnCvelth new A(a1) 直接用a1 的副本初始化A 新创建的。由于取消引用它会为您提供一个左值,因此您可以使用刚刚创建的对象复制初始化 a2。所以,你得到的是对复制构造函数的两次调用和一次内存泄漏。
猜你喜欢
  • 2017-09-03
  • 2020-04-18
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多