——C++不自動轉換不兼容的類型,允許用戶自定義類類型的自動和強制轉換
其它類型轉成類:
只接受一個參數的構造函數可作為轉換函數(若其它參數都有默認值,則也符合情況)
class Stonewt { private: ... public: Stonewt (double lbs); {...} // template ofr double_-to-Stonewt conversion ... } ------------------------------------------------------------------>main() Stonewt myCat; // create a Stonewt object myCat = 19.6; // 隱式自動轉換 use Stonewt(double) to convert 19.6 to Stonewt myCat = Stonewt (19.6); // 顯示強制轉換 myCat = (Stonewt) 19.6; // 顯示強制轉換
- 程序使用構造函數Stonewt(double)來創建一個臨時對象,並初始化;隨后采用逐成員賦值方式將該臨時對象的內容復制到myCat中
- 關閉自動隱式轉換:
- C++新增關鍵字explicit
- 用在聲明頭部
- 不影響顯示強制轉換
- 函數原型化提供的參數匹配過程,允許使用Stonewt (double) 構造函數來轉換其它數值類型,例如允許傳入int型數據,它將自動轉換為double,條件是轉換過程中不存在二義性
- 如果類中還有Stonewt (long) 就存在二義性,double可轉換為long
轉換函數:
——特殊的C++運算符函數,是用戶定義的強制類型轉換,可以像使用強制類型轉換那樣使用它們。
創建:
operator typeName ();
- 必須是類方法
- 不能指定返回類型
- 不能有參數
例如,轉換為double類型的函數的原型如下
operator double ();
- double即typeName指出要轉換成的類型
- 雖然沒有聲明返回類型,這個函數也將返回所需的值
使用:
cout<<"Poppins: "<<int (poppins)<<" pounds.\n"; // popins is object
cout語句使用顯示強制類型轉換
cout<<"Poppins: "<<poppins<<" pounds.\n";
這里的cout應用自動類型轉換
-
- 類只定義了double轉換函數時可用,若還有int轉換函數,則編譯器報錯二義性
- 當類定義了兩種或更多的轉換時,仍可以使用顯示強制類型轉換來指出要使用哪個轉換函數
原則上說,最好使用顯示轉換,而避免隱式轉換(發生意想不到的錯誤:1.如將對象錯當數組下標並不會報錯 2.友元函數的參數是兩個類引用,傳入值中一個是標准類型,一個是類對象,則會發生是將標准類型轉換為類【前一種構造轉換函數】還是將類轉換為標准類型【后一種轉換函數】)。在C++98中,關鍵字explicit不能用於轉換函數,但C++11消除了這種限制,使得只能顯示轉換,這樣就規避了第二種錯誤,以及提醒程序員不要犯第一種錯誤。
class Stonewt { ... // conversion functions explicit operator int() const; explicit operator double() const; };
有了這些聲明后,需要強制轉換時將調用這些運算符
將類對象賦給typeName變量或將其強制轉換為typeName類型時,該轉換函數將自動被調用