14.1 過載操作符的定義
過載操作符是具有特殊名稱的函式:保留字operator後接需定義的操作符符號。像任何其他函式一樣,過載操作符具有返回型別和形參表。
除了函式呼叫操作符之外,過載操作符的形引數目(包括成員函式的隱式this指標)與操作符的運算元目相同。函式呼叫操作符可以接受任意數目的運算元。
2. 過載操作符必須具有乙個類型別運算元
用於內建型別的操作符,其含義不能改變。
也不能為任何內建型別定義額外的新的操作符。
過載操作符必須具有至少乙個類型別或列舉型別的運算元。這條規則強制過載操作符不能重新定義內建型別物件的操作符的含義。
3. 優先順序和結合性是固定的
操作符的優先順序、結合性或運算元數目不能改變。
除了函式呼叫操作符operator()之外,過載操作符時使用預設實參是非法的。
4. 不再具備短路求值特性
5. 大多數過載操作符可以定義為普通非成員函式或類的成員函式。
作為類成員的過載函式,其形參看起來比運算元數目少1.作為成員函式的操作符有乙個隱含的this形參,限定為第乙個運算元。
一般將算術和關係操作符定義為非成員函式,而將賦值操作符定義為成員。
6. 操作符過載和友元關係
操作符定義為非成員函式時,通常必須將它們設定為所操作類的友元。在這種情況下,操作符通常需要訪問類的私有部分。
7. 使用過載操作符
可以像呼叫普通函式一樣呼叫過載操作符函式,指定函式並傳遞適當型別適當數目的形參。
過載操作符的設計
1. 不要過載具有內建含義的操作符
賦值操作符、取位址操作符和逗號操作符對類型別運算元有預設含義。如果沒有特定過載版本,編譯器就自己定義這些操作符。
通過為給定類型別的運算元重定義操作符,可以改變這些操作符的含義。
2. 大多數操作符對類物件沒有意義
除非提供了過載定義,複製、取位址和逗號操作符對於類型別運算元沒有意義。設計類的時候,應該確定要支援那些操作符。
為類設計操作符,最好的方式是首先設計類的公共介面。定義了介面之後,就可以考慮應將那些操作符定義為過載操作符。那些邏輯上可以對映到某個操作符的操作可以考慮作為候選的過載操作符。
3. 復合賦值操作符
當乙個過載操作符的含義不明顯時,給操作取乙個名字更好。對於很少用的操作,使用命名函式通常也比操作符更好。如果不是普通操作,沒有必要為簡潔而使用操作符。
4. 相等和關係操作符
將要用作關聯容器鍵型別的類應定義《操作符。關聯容器預設使用鍵型別的《操作符。即使該型別將只儲存在順序容器中,類通常也應該定義相等(==)操作符和小於(<)操作符,理由是許多演算法假定這些操作符存在。例如sort演算法使用《操作符,而find演算法使用==操作符。
如果類定義類相等操作符,它也應該定義不等操作符!=。如果類定義了<,則它可能應該定義全部的四個關係操作符(>,>=,<,<=)。
5. 選擇成員或非成員實現
賦值(=),下標(),呼叫(())和成員訪問箭頭(->)等操作必須定義為成員,將這些操作定義為非成員函式將在編譯時標記為錯誤。
像賦值一樣,復合賦值操作通常應定義為類的成員。與賦值不同的是,不一定非得這樣做,如果定義非成員復合賦值操作符,不會出現編譯錯誤。
改變物件狀態或與給定型別緊密聯絡的其他一些操作符,如自增、自減和解引用,通常應定義為類成員。
對稱的操作符最好定義為普通非成員函式。
第14章 過載操作符與轉換 2
14.2 輸入和輸出操作符 支援i o操作的類所提供的i o操作介面,一般應該與標準庫iostream為內建型別定義的介面相同,因此,許多類都需要過載輸入和輸出操作符。14.2.1 輸出操作符 的過載 為了與io標準庫一致,操作符應接受ostream 作為第乙個形參,對類型別const物件的引用作為...
第14章 過載操作符與轉換 8
14.9 轉換與類型別 14.9.1 轉換為什麼有用 1.支援混合型別表示式 2.轉換減少所需操作符的數目 14.9.2 轉換操作符 轉換操作符 conversion operator 是一種特殊的類成員函式。它定義將類型別值轉變為其他型別值的轉換。轉換操作符在類定義體內宣告,在保留字operato...
過載操作符與轉換
過載操作符函式 保留字operator後接需要定義的操作符號,有返回型別和形參表 不能過載的操作符有 不能通過連線其他合法符號來建立任何新的操作符 過載操作符必須具有乙個類型別運算元,以為如果只有內建型別物件的話,會重新定義原來的操作符 操作符的優先順序和結合性是固定的 不再具備短路求值特性 當運算...