是否需要复制构造函数和赋值?
Is there a need for both the copy constructor and assignment?
我读了两篇关于stackOverflow的文章,一篇描述了复制和交换习语,另一篇讨论了移动语义,但我不明白为什么当移动构造函数或复制构造函数已经为我们做了这项工作时,我们需要交换赋值运算符
所以根据我的理解,如果我们使用左值,赋值运算符将使用复制构造函数构造一个对象,如果右值它将使用 move 构造函数构造一个对象,所以假设我们选择后者
假设我们有一个交换对象成员的函数,下面是赋值运算符,所以正如我所说,假设我们首先有一个右值,operator= 将使用移动构造函数构造一个对象,那么为什么我们需要这里的交换函数呢?
我们已经完成了我们想要的,我们已经使用 move 构造函数创建了一个对象并"窃取或获取"了我们需要的数据,那么需要额外的交换吗?
我们不是只是在交换时重新做同样的事情吗?
以下是文章/主题
什么是移动语义?
什么是复制和交换成语?
dumb_array& operator=(dumb_array other) // (1)
{
swap(*this, other); // (2)
return *this;
}
分配对象时有两个问题:
- 我们希望将源内容的副本获取到目标中。
- 我们希望正确处理目的地的原始内容。
由于我们有一个复制构造函数,因此为我们完成了第一步。我们可以将临时副本的内容move
到目的地,但关注两个呢?
我们有一个处理处置的析构函数,那么为什么不使用它呢? 如果将目标的内容交换为临时内容,则销毁临时内容可确保正确释放目标的原始内容,而无需编写新代码或复制现有代码。
请注意,复制和交换可能比您实际需要的重量更重,但它永远不会失败(假设它所依赖的功能是正确的(,这使其成为一个很好的起点。
相关文章:
- 使用基类指针调用基类的值构造函数的语法是什么?
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 调用值构造函数而不是复制构造函数
- 复制和赋值构造函数的问题
- 重载赋值运算符函数和复制构造函数中的错误
- 将函数赋值给函数指针,常量参数正确性
- 未调用右值构造函数
- CRTP 和复制/移动赋值/构造函数继承
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- 如何使用其定义附近的显式长度/值构造函数初始化向量成员变量
- template_back和move赋值构造函数存在问题
- C++赋值构造函数瓦尔格林德错误
- 数组C++的复制和赋值构造函数示例
- Linux vs Windows std::map 赋值构造函数(为什么会有这样的区别?)
- 'explicit' g ++ 中的关键字对简单构造函数(不是复制/赋值构造函数)没有影响?
- C++赋值构造函数
- 使用模板化构造函数时禁用默认复制构造和赋值构造函数
- 将赋值/构造函数移出继承范围
- 复制和交换技术在赋值操作符函数内部使用复制构造函数
- 调用复制构造函数或赋值构造函数时