轉換函數和explicit

我們已經在不知不覺中使用到了轉換函數:
Student stu1;
stu1 = 95.0;
程序將使用構造函數來創建一個臨時的Student對象,並將95作爲初始化值。隨後,採用逐成員賦值方式將該臨時對象的內容複製到stu1中。這一過程稱爲隱式轉換,因爲它是自動進行的,而不需要顯式強制類型轉換。
使用規範只有接受一個參數的構造函數才能作爲轉換函數。如果構造函數包含多個參數,必須給後面的參數提供默認值,這樣也可以作爲轉換函數。
將構造函數用作自動類型轉換函數似乎是一項不錯的特性。然而,這種自動特性並非總是合乎需要的,因爲這會導致意外的類型轉換,因此,C++新增了關鍵字explicit,用於關閉這種自動特性
explicit Student(double scores);
只接受一個參數的構造函數定義了從參數類型到類類型的轉換,如果使用關鍵字explicit限定了這種構造函數,則它只能用於顯示轉換,否則也可以用於隱式轉換。
有時候編譯器會進行二步轉換:
stu1 = 95;
先將int型95轉換爲double型95.0,再講double型95.0轉換爲Student型。當且僅當轉換不存在二義性時,纔會進行這種二步轉換。也就是說,如果這個類還定義了構造函數Student(double),則編譯器將拒絕這些語句,可能指出:int可被轉換爲long或double,因此調用存在二義性。

構造函數只能用於從某種類型類類型的轉換,要進行相反的轉換必須使用特殊的C++運算符函數——轉換函數。
operator typeName();
幾點注意事項:
  • 轉換函數必須是類方法
  • 轉換函數不能指定返回類型
  • 轉換函數不能有參數
同樣的,也可以在轉換函數前面加上explicit關鍵字防止隱式轉換。
最後應當謹慎的使用隱式轉換函數。通常,最好選擇僅在被顯式地調用時纔會執行的函數。這樣做更保險。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章