C 基礎教程物件導向(學習筆記(24))

2021-08-29 03:28:01 字數 3225 閱讀 9319

過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。

因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。

這是乙個帶有過載運算子==和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 ...