過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。
因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。
這是乙個帶有過載運算子==和operator!=的car類的示例。
#include #include class car
friend bool operator== (const car &c1, const car &c2);
friend bool operator!= (const car &c1, const car &c2);};
bool operator== (const car &c1, const car &c2)
bool operator!= (const car &c1, const car &c2)
int main()
這裡的**應該是很直接的。因為operator!=的結果與operator 相反,我們根據operator定義operator!=,這有助於使事情更簡單,更無錯誤,並減少我們編寫的**量。
operator《和operator>怎麼樣?汽車比另一輛汽車更大或更小的意義是什麼?我們通常不會這樣考慮汽車。由於operator 《和operator>的結果不會立即直觀,因此最好不要定義這些運算子。
建議:不要定義對您的類沒有意義的過載運算子。
但是,上述建議有乙個共同的例外。如果我們想要對汽車列表進行排序怎麼辦?在這種情況下,我們可能希望過載比較運算子以返回您最有可能要排序的成員(或成員)。例如,過載的operator《對於 cars可能會按字母順序基於品牌和型號進行排序。
標準庫中的一些容器類(包含其他類的集合的類)需要過載的operator《所以它們可以保持元素的排序。
以下是過載operator>,operator <,operator> =和operator <=的不同示例:
#include class cents
friend bool operator> (const cents &c1, const cents &c2);
friend bool operator<= (const cents &c1, const cents &c2);
friend bool operator< (const cents &c1, const cents &c2);
friend bool operator>= (const cents &c1, const cents &c2);};
bool operator> (const cents &c1, const cents &c2)
bool operator>= (const cents &c1, const cents &c2)
bool operator< (const cents &c1, const cents &c2)
bool operator<= (const cents &c1, const cents &c2)
int main()
這也非常簡單。
注意,這裡也有一些冗餘。operator>和operator <=是邏輯對立面,因此可以用另乙個來定義。operator 《和operator> =也是邏輯對立面,乙個可以用另乙個來定義。在這種情況下,我選擇不這樣做,因為函式定義非常簡單,函式名中的比較運算子與return語句中的比較運算子可以很好地對齊。
quiz time:
1)對於上面的cents示例,根據其他過載運算子重寫運算子《和<=。
解決方案
#include class cents
friend bool operator> (const cents &c1, const cents &c2);
friend bool operator<= (const cents &c1, const cents &c2);
friend bool operator< (const cents &c1, const cents &c2);
friend bool operator>= (const cents &c1, const cents &c2);};
bool operator> (const cents &c1, const cents &c2)
bool operator>= (const cents &c1, const cents &c2)
// 《是》 =的邏輯相反,所以我們可以》 =並反轉
bool operator< (const cents &c1, const cents &c2)
// <= 是》的邏輯相反,所以我們可以做》並反轉結
bool operator<= (const cents &c1, const cents &c2)
int main()
2)將過載的運算子《和operator 《新增到本課程頂部的car類,以便以下程式編譯:
#include #include #include #include int main()
該程式應產生以下輸出:
(honda,accord)
(honda,civic)
(toyota,camry)
(toyota,corolla)
解決方案:
#include #include #include #include class car
friend bool operator== (const car &c1, const car &c2);
friend bool operator!= (const car &c1, const car &c2);
friend std::ostream& operator<< (std::ostream& out, const car & c)
// h/t to reader olivier for this version of the function
friend bool operator<(const car &c1, const car &c2) };
bool operator== (const car &c1, const car &c2)
bool operator!= (const car &c1, const car &c2)
int main()
C 基礎教程物件導向(學習筆記5(2))
在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...
C 基礎教程物件導向(學習筆記(23))
過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...
C 基礎教程物件導向(學習筆記(29))
重新初始化型別 由於我們將在接下來的幾節課中談論很多初始化,讓我們首先回顧一下c 支援的初始化型別 直接初始化,統一初始化或拷貝初始化。以下是使用我們的fraction類的所有示例 include include class fraction friend std ostream operator ...