——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; // 顯示強制轉換
——特殊的C++運算符函數,是用戶定義的強制類型轉換,能夠像使用強制類型轉換那樣使用它們。函數
operator typeName ();
例如,轉換爲double類型的函數的原型以下spa
operator double ();
cout<<"Poppins: "<<int (poppins)<<" pounds.\n"; // popins is object
cout語句使用顯示強制類型轉換code
cout<<"Poppins: "<<poppins<<" pounds.\n";
這裏的cout應用自動類型轉換對象
原則上說,最好使用顯示轉換,而避免隱式轉換(發生意想不到的錯誤:1.如將對象錯當數組下標並不會報錯 2.友元函數的參數是兩個類引用,傳入值中一個是標準類型,一個是類對象,則會發生是將標準類型轉換爲類【前一種構造轉換函數】仍是將類轉換爲標準類型【後一種轉換函數】)。在C++98中,關鍵字explicit不能用於轉換函數,但C++11消除了這種限制,使得只能顯示轉換,這樣就規避了第二種錯誤,以及提醒程序員不要犯第一種錯誤。blog
class Stonewt { ... // conversion functions explicit operator int() const; explicit operator double() const; };
有了這些聲明後,須要強制轉換時將調用這些運算符ci
將類對象賦給typeName變量或將其強制轉換爲typeName類型時,該轉換函數將自動被調用原型