比较运算符重载

时间:2012-05-13 22:34:49

标签: c++ operators

哪种是最佳做法(在这种情况下):

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更好,因为没有进行另一个方法调用,这是正确的吗?

5 个答案:

答案 0 :(得分:32)

第二个实现有明显的约束,==将永远是!=的布尔反对。这可能就是您想要的,它使您的代码更易于维护,因为您只需要更改一个实现以使两者保持同步。

答案 1 :(得分:12)

重载比较运算符时,应始终使用所拥有的内容。您应该定义的唯一两个是operator==operator<。其余的你可以写这两个。它不容易出错,就像你有错误一样,它只在一个地方。

OOP的一个主要特性是代码可重用性。如果您已编写代码,为什么要再次编写代码?坚持你拥有的东西,你只需要测试一件事。

它更像是声明一个常量,然后在整个文件的几个位置使用它。

答案 2 :(得分:4)

实现2更好,因为它使用已定义的运算符==。这些运算符函数也应该是const,因为它们不会修改对象。

答案 3 :(得分:3)

以上都不是。

我希望我能找到真正详细介绍过这篇论文的论文,但我不记得这个名字了。

您的比较操作应该是外部的。您的界面应该足以找到对象的状态,并且对象的状态应该指示比较。应该可以在你的课外写“等于”,从而真正做出任何比较,这是可能的......你想要的。

答案 4 :(得分:2)

通常,实现2由于许多原因更好。首先,你不要写(几乎)重复的代码。如果您需要更改它(因为类已经增长或存在错误),再次使用实现2,您只需更改1个位置。也就是说,实现2使您的代码更加一致并且不易出错。