我们在这里讨论明确声明special member functions。这样做不好吗?我的意思是:编译器生成的版本执行成员操作。如果我实现完全相同的方法(考虑rule of three/five),除了它更多的工作,这是一个不好的做法吗?
当然,人们可以说它是多余的并且使代码库膨胀。其他人声称有明确的声明简化了调试(例如,每当复制对象时我都可以有断点)。
编写像Explicit
这样的课程(下面,基于Wiki page的例子)不良做法或仅仅是个人品味?
class Explicit {
string msg;
public:
Explicit() : msg("") {}
Explicit(const Explicit& other) : msg(other.msg) {}
Explicit& operator=(const Explicit& other) {
if (this != &other) { msg = other.msg; }
return *this;
}
~Explicit() {}
};
答案 0 :(得分:4)
真正的冗余在于您将在这些特殊成员函数的实现中提及您的数据成员。
与所有冗余一样,这会冒一天你改变一个而不是另一个的风险,例如:添加数据成员,忘记更新特殊成员函数。
使用C ++ 11 = default
构造没有任何问题,因为这样可以避免特定的冗余。