天天看點

22、C++ Primer 4th 筆記,到類類型與從類類型的轉換

1、轉換分為到類類型與從類類型的轉換兩種。到類類型的轉換:通過轉換構造函數;從類類型的轉換:轉換操作符。

2、常用16個操作符:5個算術操作符(+、-、*、/、%)及其對應的複合指派操作符,4 個關系操作符(<、<=、>、>=),以及相等操作符(==、!=)。

示例

通用形式:operator type();

    type表示内置類型名,類類型名或由類型别名所定義的名字。對任何可作為函數傳回類型的類型(除了void之外),都可以定義轉換函數。一般而言,不允許轉換為數組或函數類型,轉換為指針類型(資料或函數指針)及引用是可以的。

轉換操作符函數必須及必須是成員函數,不能指定傳回類型,形參表必須為空。

    類類型轉換不能傳遞(兩個都是自定義的轉換,而非内置類型的預設轉換),如A->B,B->C,但是我們不能把需要C類型參數的地方傳遞A類型的參數。

3、完全比對轉換比需要标準轉換的其他轉換更好。

4、轉換的二義性

示例二義性

避免二義性最好的方法是避免編寫互相提供隐式轉換的成對的類。保證最多隻有一種途經将一個類型轉換成另一個類型。

可以通過顯式強制消除二義性。

    有調用重載函數時,需要使用構造函數或強制類型轉換來轉換實參是拙劣設計的表現。

5、操作符的重載确定,三步:

1)選擇候選函數。

2)選擇可行函數,包括識别每個實參的潛在轉換序列。

3)選擇最佳比對的函數。

6、幾個經驗

1)不要定義互相轉換的類,即如果類 Foo 具有接受類 Bar 的對象的構造函數,不要再為類 Bar 定義到類型 Foo 的轉換操作符。

2)避免到内置算術類型的轉換。具體而言,如果定義了到算術類型的轉換,則

    o不要定義接受算術類型的操作符的重載版本。如果使用者需要使用這些操作符,轉換操作符将轉換你所定義的類型的對象,然後可以使用内置操作符。

    o不要定義轉換到一個以上算術類型的轉換。讓标準轉換提供到其他算術類型的轉換。

    最簡單的規則是:對于那些“明顯正确”的,應避免定義轉換函數并限制非顯式構造函數。

參考

上一篇: 計算圓周率

繼續閱讀