重载复制构造函数

pse*_*127 0 c++

我遇到了一些代码,其中一个人重载了复制构造函数和赋值运算符,如下所示:

 Prod(const Prod& src) {  
        _id    = src._id;
        _name  = src._name;
        _group = src._group;
        ...
}

 Prod& operator=(const Prod& src) {  
        _id    = src._id;
        _name  = src._name;
        _group = src._group;
        ...
}
Run Code Online (Sandbox Code Playgroud)

我觉得奇怪的是 Prod 类中的所有成员变量都不是指针。那么为什么需要像上面那样重载复制构造函数和 = 运算符呢?

Luc*_*ore 5

如果该类不管理资源,那么您是对的,没有必要使它们过载。如果它被用作基类并且它有一个virtual析构函数,它们可能在那里遵守三规则,尽管 C++11 替代方案= default比实际实现它们更清晰。

在旁注中,可以使用复制构造函数来实现,operator =以避免重复逻辑:

Prod(const Prod& src) {  
   *this = src;
}
Run Code Online (Sandbox Code Playgroud)

  • 在赋值运算符的帮助下实现复制构造函数在概念上是完全错误的,构造函数构造,它不分配(分配给还没有任何东西的东西,你说的默认构造对象,这不是副本那么构造函数,是吗?)。除了完全定义它们之外,这也是问题中那个*“一个人”* 的错误之一。 (4认同)
  • @Walter 使用 copy ctor 赋值是的,通过 copy&swap 成语。使用placement new:永远不要那样做。你在这里弄乱了对象的生命周期,即销毁和创建一个对象,同时假装它继续存在。 (2认同)