重载的复制构造函数

时间:2013-07-08 08:22:12

标签: 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;
        ...
}

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

2 个答案:

答案 0 :(得分:4)

如果班级没有管理资源,那么你是对的,没有必要重载它们。如果它被用作基类并且它有一个virtual析构函数,它们可能会遵守三条规则,尽管C ++ 11替代= default比实际实现它们更干净。

另一方面,可以使用operator =实现复制构造函数,以避免重复逻辑:

Prod(const Prod& src) {  
   *this = src;
}

答案 1 :(得分:2)

有一个rule of three,然后现在有一个rule of five很可能会被rule of zero取代。

也许某人不确定魔杖只是添加了一些额外的代码..;)

一般来说,当所有成员字段都是简单或自动管理时(即使用适当的ctors,copyctors,movectors,assignement,dtors等),那么编写任何东西都没有意义。参见零规则。但是,这可能是在旧版标准下创建的代码的一部分,或者在某些编译器中创建的代码的一部分,这些代码很好,很多,并且可能在过去的某个时间点需要。现在可能你可以将其删除并留给默认实现。