【问题标题】:Using the copy and swap idiom for assignment operator with derived classes对派生类的赋值运算符使用复制和交换习语
【发布时间】:2015-07-21 13:37:19
【问题描述】:

从包括one 在内的各种帖子中,我注意到了复制和交换习语,但是我不确定如何在派生类中实现此代码。 那里的代码指定为

dumb_array& operator=(dumb_array other) // (1)
{
    swap(*this, other); // (2)

    return *this;
}

我了解,每当在派生类中定义自定义赋值运算符时,该方法就有责任调用基类的赋值运算符。在这种情况下,我将如何以最佳方式调用基类的赋值运算符。这是我的尝试

dumb_array& operator=(dumb_array other)
{
    swap(*this, other); 
    baseclass::operator= other; //Suppose base class has assignment operator resembling this
    return *this;
}

我的理解是,如果我们从派生类调用基类赋值运算符,那么复制构造函数(因为参数是值类型)将被调用两次(一次用于派生,然后再次用于基类)(这只是如果它是单个继承链)将派生类的复制赋值运算符与基类一起调用的最佳方法是什么?我们是否需要对 swap 方法进行更改?

【问题讨论】:

  • 有没有必要打电话给baseclass::operator=

标签: c++ c++11


【解决方案1】:

您正在混合在不同上下文中使用的两个习语。

swap 调用可以交换 POD 或类似的东西。

另一方面,当您有一个可能不是正确的类层次结构时,这里是第二种方法(依赖于知道如何交换自身的基类可能更合适)。

但还有一点值得一提:重写 operator= 是具有值语义的类的典型,而当您开始处理派生类(并且可能处理仅包含指向基类的指针的对象)时,这不再是案例(你宁愿 clone() 对象而不是复制它们)

【讨论】:

    【解决方案2】:

    在这种情况下,无需在派生类的operator= 中调用baseclass::operator=。当您按值传递参数时,您已经获得了由派生类的复制构造函数生成的有效副本,特别是应该调用基类的复制构造函数。所以你的初始代码对于派生类也是完全有效的。

    【讨论】:

      【解决方案3】:

      对派生类的赋值运算符使用复制和交换习语

      这不是你应该做的事情(由于slicing problem)。如果你的类有多态行为,通常你不需要赋值——你需要复制值,记住多态行为。这意味着克隆,在基类级别定义并在整个层次结构中实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 2012-02-12
        • 2021-07-31
        相关资源
        最近更新 更多