比较运算符
你可以重载所有比较运算符:
==
和!=
>
和<
>=
和<=
重载所有运算符的推荐方法是仅实现 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
,表示 true
或 false
用于相应的操作。
所有的运算符都是通过 const&
来获取它们的参数,因为运算符唯一能做的就是比较,所以它们不应该修改对象。通过 &
(参考)传递比按值快,并且为了确保操作符不修改它,它是一个参考。
请注意,class
/ struct
中的运算符定义为 const
,其原因是如果没有函数 const
,则无法比较 const
对象,因为编译器不知道运算符不会修改任何内容。