繁体   English   中英

复制构造函数和赋值都需要吗?

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

我在stackOverflow上阅读了两篇文章,一篇描述了复制和交换的习惯用法,另一篇关于移动语义,但是我看不到为什么在移动构造函数或复制构造函数已经为我们完成了这件事之后,为什么需要在赋值运算符中进行交换

因此,据我所解释,如果我们使用左值,赋值运算符将使用副本构造函数构造一个对象,如果右值将使用移动构造函数构造一个对象,那么可以说我们选择后者

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

我们已经实现了我们想要的目标,我们使用move构造函数创建了一个对象,并“窃取或获取了”我们需要的数据,那么额外交换的需求是什么?

我们不是只是在交换相同的内容而已吗?

这是文章/主题

什么是移动语义?

什么是复制和交换习语?

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

    return *this;
}

分配对象时有两个注意事项:

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

由于我们有一个复制构造函数,因此第一步已为我们完成。 我们可以move临时副本的内容move目标位置,但是第二点要注意什么呢?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM