比較運算子

你可以過載所有比較運算子:

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

過載所有運算子的推薦方法是僅實現 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 物件,因為編譯器不知道運算子不會修改任何內容。