哪种是最佳做法(在这种情况下):
bool Foo::operator==(const Foo& other) {
return bar == other.bar;
}
// Implementation 1
bool Foo::operator!=(const Foo& other) {
return bar != other.bar
}
// Implementation 2
bool Foo::operator!=(const Foo& other) {
return !(*this == other);
}
对于像>,<,< =,> =这样的运算符,我会尽可能使用实现2。但是,对于!=我认为实现1更好,因为没有进行另一个方法调用,这是正确的吗?
答案 0 :(得分:32)
第二个实现有明显的约束,==
将永远是!=
的布尔反对。这可能就是您想要的,它使您的代码更易于维护,因为您只需要更改一个实现以使两者保持同步。
答案 1 :(得分:12)
重载比较运算符时,应始终使用所拥有的内容。您应该定义的唯一两个是operator==
和operator<
。其余的你可以写这两个。它不容易出错,就像你有错误一样,它只在一个地方。
OOP的一个主要特性是代码可重用性。如果您已编写代码,为什么要再次编写代码?坚持你拥有的东西,你只需要测试一件事。
它更像是声明一个常量,然后在整个文件的几个位置使用它。
答案 2 :(得分:4)
实现2更好,因为它使用已定义的运算符==。这些运算符函数也应该是const
,因为它们不会修改对象。
答案 3 :(得分:3)
以上都不是。
我希望我能找到真正详细介绍过这篇论文的论文,但我不记得这个名字了。
您的比较操作应该是外部的。您的界面应该足以找到对象的状态,并且对象的状态应该指示比较。应该可以在你的课外写“等于”,从而真正做出任何比较,这是可能的......你想要的。
答案 4 :(得分:2)
通常,实现2由于许多原因更好。首先,你不要写(几乎)重复的代码。如果您需要更改它(因为类已经增长或存在错误),再次使用实现2,您只需更改1个位置。也就是说,实现2使您的代码更加一致并且不易出错。