【问题标题】:C++: call copy assignment in copy constructorC++:在复制构造函数中调用复制赋值
【发布时间】:2013-10-27 08:59:17
【问题描述】:

好的,我正在阅读“有效 C++”,第 12 条说请不要在复制构造函数中调用复制赋值。但是在我尝试这样做之后,它确实有效。所以想问一下为什么,复制构造函数中的复制赋值代码不能重用?

【问题讨论】:

  • 我认为这是因为通过在初始化列表中直接复制它们可能更有效的成员初始化。
  • 我感觉这在“Effective C++”的第 12 项中得到了很好的解释。
  • 希望所有答案都或多或少地解释了 Scott 在 Item 12 中解释的内容
  • 在第 12 项的结尾处,您有一个解释:“对正在构建的对象执行分配意味着对尚未初始化的对象执行某些操作,该操作仅对已初始化的对象有意义"

标签: c++ constructor copy variable-assignment


【解决方案1】:

假设您在复制构造函数中使用复制赋值运算符。那么你就失去了为赋值运算符实现copy-and-swap成语的能力:

struct A
{
   A (const A &a)
   {
     *this = a; // Assignment to a not yet constructed object is not well
   }

   A &operator=(A a) // Pass by value
   {
      // ...
   }
};

A a1, a2;
a1 = a2; // Infinite recursion!

这是不可能的,会发生无限递归。

【讨论】:

  • 谢谢,我觉得很有用。如果参数是按值传递的,将导致无限递归,并且分配给未构造的对象并不好。抱歉,我没有足够的声望来投票。
【解决方案2】:

构造函数创建一个新对象;赋值运算符修改现有对象。你不能使用赋值运算符来创建一个新对象:它不知道怎么做,即使它看起来在简单的情况下也能工作。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2011-02-08
    • 2013-06-09
    • 2017-09-03
    • 2011-06-09
    • 2013-09-28
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多