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類型的函數的原型以下spa

operator double ();
  • double即typeName指出要轉換成的類型
  • 雖然沒有聲明返回類型,這個函數也將返回所需的值

使用:

cout<<"Poppins: "<<int (poppins)<<" pounds.\n";  // popins is object

 cout語句使用顯示強制類型轉換code

cout<<"Poppins: "<<poppins<<" pounds.\n";

這裏的cout應用自動類型轉換對象

    • 類只定義了double轉換函數時可用,若還有int轉換函數,則編譯器報錯二義性
    • 當類定義了兩種或更多的轉換時,仍能夠使用顯示強制類型轉換來指出要使用哪一個轉換函數

原則上說,最好使用顯示轉換,而避免隱式轉換(發生意想不到的錯誤:1.如將對象錯當數組下標並不會報錯 2.友元函數的參數是兩個類引用,傳入值中一個是標準類型,一個是類對象,則會發生是將標準類型轉換爲類【前一種構造轉換函數】仍是將類轉換爲標準類型【後一種轉換函數】)。在C++98中,關鍵字explicit不能用於轉換函數,但C++11消除了這種限制,使得只能顯示轉換,這樣就規避了第二種錯誤,以及提醒程序員不要犯第一種錯誤。blog

class Stonewt
{
 ...
// conversion functions
    explicit operator int() const;
    explicit operator double() const;
};

  有了這些聲明後,須要強制轉換時將調用這些運算符ci

將類對象賦給typeName變量或將其強制轉換爲typeName類型時,該轉換函數將自動被調用原型

相關文章
相關標籤/搜索