C++ 自動轉換和強制類型轉換(用戶自定義類類型)


——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類型時,該轉換函數將自動被調用

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM