——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型別時,該轉換函式將自動被呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13749.html
標籤:C++
上一篇:C++ rand函式
下一篇:C++ 轉換函式搭配友元函式
