天天看點

轉換與類類型

類型間的轉化一般有兩種方式

1. 構造函數定義的隐式轉換

2.由轉換操作符定義的類類型的轉換

類類型轉換能為我們實作和使用類提供很大的好處,但是也可能是編譯時錯誤的一大來源。當一個類型轉換到另一個類型有多種方式時問題也就出現了。

定義一個簡單的類:

class example

{

public:

         example (int=0);

         example(double);

         operator int(){return val;}

         operator double(){return val;}

private:

        std::size_t val;

}

如果給函數void game(long double)傳遞example類型的實參,則調用具有二義性。如果game可以接受int和double類型的實參,也就是說game為重載函數時,也将出現調用錯誤。是以多個操作符轉化容易引起函數及函數重載調用的錯誤。

如果給函數viod game(example )傳遞long double類型的實參,将不能分辨調用哪個構造函數實作隐式轉換,進而也具有二義性----多個隐式構造函數引起的二義性

 class example2

class example1

{

public:

         example1 (example2);

}

class example2

{

public:

         operator example1 ();

}  如果存在函數viod compute(example1) ,并且實參為example2類型的對象,則編譯器可以使用構造函數,也可以使用轉換操作符,這兩個函數沒有高下之分,調用會出錯。

避免二義性的最好方法是,保證最多隻有一種途徑将一個類型轉換為另一個類型,做到這一點,最好的辦法是限制轉化操作符的數目,尤其是到一種内置類型應該隻有一個轉化。

繼續閱讀