我遇到了一些代码,其中一个人重载了复制构造函数和赋值运算符,如下所示:
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类中没有成员变量是指针。那么为什么需要像上面一样重载复制构造函数和=运算符呢?
答案 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等),那么编写任何东西都没有意义。参见零规则。但是,这可能是在旧版标准下创建的代码的一部分,或者在某些编译器中创建的代码的一部分,这些代码很好,很多,并且可能在过去的某个时间点需要。现在可能你可以将其删除并留给默认实现。