1. 程式人生 > >類的自動型別轉換和強制型別轉換

類的自動型別轉換和強制型別轉換

1.可以將類定義成與基本型別或者另一個類相關,使得從一個類轉換成另外一個型別是有意義的。

2.將基本型別轉換成類(下面以double轉換成Money類來舉例):

假設定義瞭如下類:

class Money
{
    private:
        double RMB;
        double DOLLAR;
    public:
        Money();
        Money(double r, double d);
        Money(double r);
        ~Money();

        friend ostream & operator<<(ostream & os, Money & m);
};
則其中的建構函式
Money(double r);
可以講double型別轉換成Money類這個型別。

●只有接受一個引數的建構函式才能作為轉換函式

●或者有多個引數,但是除第一個引數沒有預設值外,其他所有的引數都有預設值,這樣的建構函式也可作為轉換函式

●在正常情況下,以下程式碼是有效的:

Money m;
m = 12.3;
這種轉換成為隱式轉換。

●隱式轉換有時候會導致意外的型別轉換,所以我們有時需要關閉隱式轉換,這時我們使用關鍵字explicit:

explicit Money(double r);
使用了關鍵字explicit後,則程式碼:
Money m;
m = 12.3;
是無效的,只能使用如下方式將double型別轉換成Money類:
Money m(12.3);//或者類似初始化方式

3.類轉換為其他型別:

●建構函式只能用於從某種型別到類型別的轉換。要進行相反的轉換,必須使用特殊的c++運算子函式---轉換函式
●注意一下幾點:

   ①轉換函式必須是類的方法

   ②轉換函式不能指定返回型別

   ③轉換函式不能有引數

●轉換函式舉例:

假設有如下類定義:

class Money
{
    private:
        double RMB;
        double DOLLAR;
    public:
        Money();
        Money(double r, double d);
        Money(double r);
        ~Money();
        operator double();  //轉換函式,用於將Money類轉換成double型別

        friend ostream & operator<<(ostream & os, Money & m);
};
其中的
operator double();  //轉換函式,用於將Money類轉換成double型別
就是我們定義的轉換函式,定義方法是operator typeName()

轉換函式的使用:

int main()
{
    Money m(2.3);
    double result;
    result = m;
    cout << m;
    cout << result;
    return 0;
}
這樣就可以將類轉換成double。上例中也可以在result前加上(int)轉換成整數型別。