比较运算符

你可以重载所有比较运算符:

  • ==!=
  • ><
  • >=<=

重载所有运算符的推荐方法是仅实现 2 个运算符(==<),然后使用它们来定义其余运算符。向下滚动以获得解释

class / struct 之外超载:

//Only implement those 2
bool operator==(const T& lhs, const T& rhs) { /* Compare */ }
bool operator<(const T& lhs, const T& rhs) { /* Compare */ }

//Now you can define the rest
bool operator!=(const T& lhs, const T& rhs) { return !(lhs == rhs); }
bool operator>(const T& lhs, const T& rhs) { return rhs < lhs; }
bool operator<=(const T& lhs, const T& rhs) { return !(lhs > rhs); }
bool operator>=(const T& lhs, const T& rhs) { return !(lhs < rhs); }

class / struct 内部超载:

//Note that the functions are const, because if they are not const, you wouldn't be able
//to call them if the object is const

//Only implement those 2
bool operator==(const T& rhs) const { /* Compare */ }
bool operator<(const T& rhs) const { /* Compare */ }

//Now you can define the rest
bool operator!=(const T& rhs) const { return !(*this == rhs); }
bool operator>(const T& rhs) const { return rhs < *this; }
bool operator<=(const T& rhs) const { return !(*this > rhs); }
bool operator>=(const T& rhs) const { return !(*this < rhs); }

运算符显然返回了一个 bool,表示 truefalse 用于相应的操作。

所有的运算符都是通过 const& 来获取它们的参数,因为运算符唯一能做的就是比较,所以它们不应该修改对象。通过 &(参考)传递比按值快,并且为了确保操作符不修改它,它是一个参考。

请注意,class / struct 中的运算符定义为 const,其原因是如果没有函数 const,则无法比较 const 对象,因为编译器不知道运算符不会修改任何内容。