是否需要复制构造函数和赋值?

Is there a need for both the copy constructor and assignment?

本文关键字:赋值 构造函数 复制 是否      更新时间:2023-10-16

我读了两篇关于stackOverflow的文章,一篇描述了复制和交换习语,另一篇讨论了移动语义,但我不明白为什么当移动构造函数或复制构造函数已经为我们做了这项工作时,我们需要交换赋值运算符

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

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

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

我们不是只是在交换时重新做同样的事情吗?

以下是文章/主题

什么是移动语义?

什么是复制和交换成语?

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

分配对象时有两个问题:

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

由于我们有一个复制构造函数,因此为我们完成了第一步。我们可以将临时副本的内容move到目的地,但关注两个呢?

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

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