复制和交换技术在赋值运算符函数中使用复制构造函数

时间:2016-08-08 16:29:58

标签: c++

我正在阅读“Scott Meyers的有效C ++”,其中第11项建议在我的赋值运算符中使用“复制和交换”技术:

Widget& Widget::operator=(const Widget &rhs)
{
    Widget temp(rhs); // Copy constructor
    swap(temp); //Swap with *this
    return *this;
}

但是在第12项中写道:

  

让复制赋值运算符调用复制构造函数是没有意义的。

我认为第11项和第12项是矛盾的。我不正确地理解它吗?

2 个答案:

答案 0 :(得分:3)

Scott Meyers的#2;有效C ++的两次引用"你提到了两个不同方面的问题。

  • 在第11项中的代码片段中,Scott显示了实现赋值运算符的方法之一。
  • 在第12项中,您提到的引用涉及避免赋值运算符和复制构造函数之间的代码重复。引文上面的一段说:
  

这两个复制函数通常会有类似的主体,这可能会诱使您尝试通过让一个函数调用另一个函数来避免代码重复。

我对第12项的这一部分的理解是这样的:如果你尝试写下面的东西(让复制赋值操作符调用复制构造函数)那么它就错了:

PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
: Customer(rhs),   // invoke base class copy ctor
  priority(rhs.priority)
{
  logCall("PriorityCustomer copy constructor");
}

PriorityCustomer&
PriorityCustomer::operator=(const PriorityCustomer& rhs)
{
  logCall("PriorityCustomer copy assignment operator");
  this->PriorityCustomer(rhs); // This line is wrong!!!
  return *this;
}

答案 1 :(得分:-7)

我反其道而行之。我重载赋值运算符以执行“深度”复制(意味着您考虑动态内存并相应地实例化新副本)。然后在复制构造函数中使用赋值运算符。无法评论你的文字,因为我没有这本书。

Widget::Widget(const Widget& existing) : dynamicThingie(0)
{
    *this = existing;
}


Widget& Widget::operator=(const Widget& existing)
{
    a = existing.a;
    b = existing.b;

    delete dynamicThingie;
    dynamicThingie = new Thingie();
    memcpy(dynamicThingie, existing.dynamicThingie, lengthOfDynamicThingue);

    return *this;
}