比较运算符重载

bla*_*aze 35 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);
}
Run Code Online (Sandbox Code Playgroud)

对于像>,<,<=,> =这样的运算符,我会尽可能使用实现2.但是,对于!=我认为实现1更好,因为没有进行另一个方法调用,这是正确的吗?

zne*_*eak 32

第二个实现有一个值得注意的约束,它==总是与boolean相反!=.这可能是您想要的,它使您的代码更容易维护,因为您只需要更改一个实现以保持两者同步.

  • 并且这个星球上的每个C++编译器都会内联!=调用==. (7认同)
  • @Tim,如果你的编译器有LTO就可以. (3认同)

chr*_*ris 12

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

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

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

  • 其实你错了.你做的一个重要假设是`<`表示**线性顺序**.但情况可能并非如此.例如,考虑按族谱下降命令的人.这不是一个线性的顺序,有些人是没有可比性的,即我X和我的兄弟ÿ既不`X <Y`也不`X> Y`成立,即它们都返回`FALSE`.所以一般`X <Y`**不是**等同于`!(X> = Y)`和`X == Y`**不是**等同于`!(X <Y)&&!(Y <X)`. (15认同)

sas*_*ang 5

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