【问题标题】:Is there a need for both the copy constructor and assignment?是否需要复制构造函数和赋值?
【发布时间】:2018-10-31 14:10:06
【问题描述】:

我在 stackOverflow 上阅读了两篇文章,一篇描述了复制和交换习语,另一篇讨论了移动语义,但我不明白为什么我们需要在移动构造函数或复制构造函数已经完成的情况下交换赋值运算符对我们来说

所以根据我的理解,如果我们使用左值,赋值运算符将使用复制构造函数构造一个对象,如果右值将使用移动构造函数构造一个对象,那么假设我们选择后者

假设我们有一个交换对象成员的函数,下面是赋值运算符,所以正如我所说,假设我们首先有一个右值,operator= 将使用移动构造函数构造一个对象,那么为什么我们需要交换函数在这里??

我们已经完成了我们想要的我们已经使用移动构造函数创建了一个对象并“窃取或获取”了我们需要的数据,那么额外的交换需要什么?

我们不是只是在交换一遍一遍做同样的事情吗?

这里是文章/主题

What are move semantics?

What is the copy-and-swap idiom?

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

    return *this;
}

【问题讨论】:

  • 复制构造函数总是创建一个新对象,而赋值运算符永远不会。所以,是的,你需要两者。
  • 你把东西偷到other,现在你想把它换成*this

标签: c++ copy copying


【解决方案1】:

分配对象时有两个问题:

  1. 我们希望将源内容的副本复制到目标中。
  2. 我们希望正确处理目标的原始内容。

既然我们有一个拷贝构造函数,第一步就为我们完成了。我们可以只是将move 的内容临时复制到目的地,但是有什么顾虑呢?

我们有一个处理处置的析构函数,那么为什么不使用它呢?如果将目标的内容交换为临时的内容,则临时的销毁可确保目标的原始内容正确释放,而无需编写新代码或复制现有代码。

请注意,复制和交换可能比您真正需要的要重,但它永远不会失败(假设它所依赖的函数是正确的),这使它成为一个很好的起点。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2012-10-22
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多