C++ primer 第十四章

 

1. 不能改變內置類型操作符的含義,也不能爲內置類型添加新的操作符。如,不能定義接受兩個數組類型操作數的 operator+ 。

 

2. 作爲類成員的重載函數,this形參隱含作爲第一個操作數,所以形參列表看起來會比操作數數目少1 。

 

3. 對於改變對象狀態或者與給定類型緊密聯繫的操作符,如自增、自減、解引用,通常定義爲成員函數。

賦值=、下標[]、調用()、成員訪問->必須定義爲成員,如果定義爲非成員編譯時會報錯。

對於對稱的操作符,或者不與某一對象緊密相連的操作符,如算數操作符、相等操作符、關係操作符和位操作符,通常定義爲非類成員函數。

當定義爲非類成員函數時,通常需要將該函數設置爲所操作類的友元。

 

4. 加操作符返回的是一個【右值】,而複合賦值返回的是【對左操作數的引用】。

 

5. 短路求值:邏輯與和邏輯或操作符總是先計算其左操作數,如果僅依靠左操作數無法得到結果,再計算右操作數。

 

6. 不要重載具有內置含義的操作符,如:賦值操作符、取地址操作符、逗號操作符、邏輯與或等。

 

7. 對於用作關聯容器鍵類型的類,應該定義<操作符。即使類只存儲在順序容器中,最好也該定義==和<操作符,因爲很多算法用到這些操作符。如sort用到<操作符,find用到==操作符。

 

8. 如果類定義了==操作符,那也應該定義!=操作符,類用戶會假設如果可以進行相等比較,那麼也可以進行不等比較。同樣,如果定義了<,那應該同時定義<、<=、>、>=四種操作符。

 

9. 爲了與IO標準庫一致,重載<<時,應該接受ostream&(因爲無法複製ostream對象)作爲第一個形參,對類類型的const對象的引用作爲第二個形參,返回ostream&。

重載>>時,接收istream&作爲第一個形參,對類類型的非const對象的引用作爲第二個形參,返回istream&。重載<<必須處理錯誤和文件結束的可能性。

如果輸入檢測到失敗,那麼要確保對象處於可用和一致的狀態。比如讀取數據到對象中時失敗,那麼最好將這個對象置爲空,防止出現錯誤。

 

10. 定義下標操作符時,一般需要定義兩個版本,一個爲非const成員並返回引用,另一個爲const成員並返回const引用。

 

11. 區別操作符的前綴形式和後綴形式。

因爲前綴式和後綴式有同樣的形參,所以普通重載無法區分。爲了解決這一問題,後綴式操作符接受一個額外的無用int形參。使用後綴式操作符時,編譯器提供0作爲這個形參的實參。

 

12. 函數對象:定義了調用操作符()的類,通常稱爲函數對象,因爲他們的行爲類似於函數。通常用於定義與標準算法結合的謂詞函數。

 

13. 函數適配器:用於特化和擴展一元和二元函數對象,有綁定器和求反器兩種。

綁定器:通過將一個操作數綁定到給定值而將二元函數對象轉換爲一元函數對象。有兩種綁定器:

bind1st:綁定第一個實參。

bind2nd:綁定第二個實參。

求反器:將謂詞函數對象的真值求反。有兩種求反器:not1和not2。

 

14. 轉換操作符: 特殊的類成員函數。將該類類型值轉換爲其他類型值。

聲明形式:operator TYPE(); //TYPE表示要轉換成的類型,聲明沒有形參,不定義返回值

除了void外,所有可作爲函數返回類型的類型都可以作爲轉換函數的目標。

轉換函數一般不應該改變被轉換的對象。因此,轉換操作符通常定義爲const。

 

15. 類類型轉換後,不可以再跟另一個類型轉換,否則會報錯。

 

16. 避免二義性: 保證最多隻有一種途徑,可以將一個類型轉換爲另一類型。做到這一點,最好的方法是限制轉換操作符的數目,尤其是到一種內置類型應該只有一個轉換。同時,定義一個類到兩種及兩種以上內置類型的轉換是不好的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章