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不要定義轉換到一個以上算術類型的轉換。讓标準轉換提供到其他算術類型的轉換。
最簡單的規則是:對于那些“明顯正确”的,應避免定義轉換函數并限制非顯式構造函數。
參考