程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第14章 重載操作符與轉換(1)

第14章 重載操作符與轉換(1)

編輯:C++入門知識

14.1 重載操作符的定義
重載操作符是具有特殊名稱的函數:保留字operator後接需定義的操作符符號。像任何其他函數一樣,重載操作符具有返回類型和形參表。
除了函數調用操作符之外,重載操作符的形參數目(包括成員函數的隱式this指針)與操作符的操作數目相同。函數調用操作符可以接受任意數目的操作數。
2. 重載操作符必須具有一個類類型操作數
用於內置類型的操作符,其含義不能改變。
也不能為任何內置類型定義額外的新的操作符。
重載操作符必須具有至少一個類類型或枚舉類型的操作數。這條規則強制重載操作符不能重新定義內置類型對象的操作符的含義。
3. 優先級和結合性是固定的
操作符的優先級、結合性或操作數數目不能改變。
除了函數調用操作符operator()之外,重載操作符時使用默認實參是非法的。
4. 不再具備短路求值特性
5. 大多數重載操作符可以定義為普通非成員函數或類的成員函數。
作為類成員的重載函數,其形參看起來比操作數數目少1.作為成員函數的操作符有一個隱含的this形參,限定為第一個操作數。
一般將算術和關系操作符定義為非成員函數,而將賦值操作符定義為成員。
6. 操作符重載和友元關系
操作符定義為非成員函數時,通常必須將它們設置為所操作類的友元。在這種情況下,操作符通常需要訪問類的私有部分。
7. 使用重載操作符
可以像調用普通函數一樣調用重載操作符函數,指定函數並傳遞適當類型適當數目的形參。
重載操作符的設計
1. 不要重載具有內置含義的操作符
賦值操作符、取地址操作符和逗號操作符對類類型操作數有默認含義。如果沒有特定重載版本,編譯器就自己定義這些操作符。
通過為給定類類型的操作數重定義操作符,可以改變這些操作符的含義。
2. 大多數操作符對類對象沒有意義
除非提供了重載定義,復制、取地址和逗號操作符對於類類型操作數沒有意義。設計類的時候,應該確定要支持那些操作符。
為類設計操作符,最好的方式是首先設計類的公共接口。定義了接口之後,就可以考慮應將那些操作符定義為重載操作符。那些邏輯上可以映射到某個操作符的操作可以考慮作為候選的重載操作符。
3. 復合賦值操作符
當一個重載操作符的含義不明顯時,給操作取一個名字更好。對於很少用的操作,使用命名函數通常也比操作符更好。如果不是普通操作,沒有必要為簡潔而使用操作符。
4. 相等和關系操作符
將要用作關聯容器鍵類型的類應定義<操作符。關聯容器默認使用鍵類型的<操作符。即使該類型將只存儲在順序容器中,類通常也應該定義相等(==)操作符和小於(<)操作符,理由是許多算法假定這些操作符存在。例如sort算法使用<操作符,而find算法使用==操作符。
如果類定義類相等操作符,它也應該定義不等操作符!=。如果類定義了<,則它可能應該定義全部的四個關系操作符(>,>=,<,<=)。
5. 選擇成員或非成員實現
賦值(=),下標([]),調用(())和成員訪問箭頭(->)等操作必須定義為成員,將這些操作定義為非成員函數將在編譯時標記為錯誤。
像賦值一樣,復合賦值操作通常應定義為類的成員。與賦值不同的是,不一定非得這樣做,如果定義非成員復合賦值操作符,不會出現編譯錯誤。
改變對象狀態或與給定類型緊密聯系的其他一些操作符,如自增、自減和解引用,通常應定義為類成員。
對稱的操作符最好定義為普通非成員函數。

摘自 xufei96的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved