轉 C 型別轉換函式(型別轉換運算子函式)

2021-09-19 15:23:10 字數 2529 閱讀 8211

用轉換建構函式可以將乙個指定型別的資料轉換為類的物件。但是不能反過來將乙個類的物件轉換為乙個其他型別的資料(例如將乙個complex類物件轉換成double型別資料)。

c++提供型別轉換函式(type conversion function)來解決這個問題。型別轉換函式的作用是將乙個類的物件轉換成另一型別的資料。如果已宣告了乙個complex類,可以在complex類中這樣定義型別轉換函式:

operator double( )

函式返回double型變數real的值。它的作用是將乙個complex類物件轉換為乙個double型資料,其值是complex類中的資料成員real的值。請注意,函式名是operator double,這點是和運算子過載時的規律一致的(在定義運算子「+」的過載函式時,函式名是operator +)。

型別轉換函式的一般形式為:

operator 型別名( )

在函式名前面不能指定函式型別,函式沒有引數。其返回值的型別是由函式名中指定的型別名來確定的。型別轉換函式只能作為成員函式,因為轉換的主體是本類的物件。不能作為友元函式或普通函式。

從函式形式可以看到,它與運算子過載函式相似,都是用關鍵字operator開頭,只是被過載的是型別名。double型別經過過載後,除了原有的含義外,還獲得新的含義(將乙個complex類物件轉換為double型別資料,並指定了轉換方法)。這樣,編譯系統不僅能識別原有的double型資料,而且還會把complex類物件作為double型資料處理。

那麼程式中的complex類對具有雙重身份,既是complex類物件,又可作為double型別資料。complex類物件只有在需要時才進行轉換,要根據表示式的上下文來決定。轉換建構函式和型別轉換運算子有乙個共同的功能:當需要的時候,編譯系統會自動呼叫這些函式,建立乙個無名的臨時物件(或臨時變數)。

[例10.9] 使用型別轉換函式的簡單例子。

#include

using namespace std;

class complex

complex(double r,double i)

operator double( ) //型別轉換函式

private:

double real;

double imag;

};int main( )

若在main函式中有語句

c3=c1+c2;

由於已對運算子「+」過載,使之能用於兩個complex類物件的相加,因此將c1和c2按complex類物件處理,相加後賦值給同類物件c3。如果改為

d=c1+c2; //d為double型變數

將c1與c2兩個類物件相加,得到乙個臨時的complex類物件,由於它不能賦值給double型變數,而又有對double的過載函式,於是呼叫此函式,把臨時類物件轉換為double資料,然後賦給d。

從前面的介紹可知,對型別的過載和對運算子的過載的概念和方法都是相似的,過載函式都使用關鍵字operator。因此,通常把型別轉換函式也稱為型別轉換運算子函式,由於它也是過載函式,因此也稱為型別轉換運算子過載函式(或稱強制型別轉換運算子過載函式)。

假如程式中需要對乙個complex類物件和乙個double型變數進行+,-,*,/等算術運算,以及關係運算和邏輯運算,如果不用型別轉換函式,就要對多種運算子進行過載,以便能進行各種運算。這樣,是十分麻煩的,工作量較大,程式顯得冗長。如果用型別轉換函式對double進行過載(使complex類物件轉換為double型資料),就不必對各種運算子進行過載,因為complex類物件可以被自動地轉換為double型資料,而標準型別的資料的運算,是可以使用系統提供的各種運算子的。

[例10.10] 包含轉換建構函式、運算子過載函式和型別轉換函式的程式。先閱讀以下程式,在這個程式中只包含轉換建構函式和運算子過載函式。

#include

using namespace std;

class complex

//預設建構函式

complex(double r)//轉換建構函式

complex(double r,double i)//實現初始化的建構函式

friend complex operator + (complex c1,complex c2); //過載運算子「+」的友元函式

void display( );

private:

double real;

double imag;

};complex operator + (complex c1,complex c2)//定義運算子「+」過載函式

void complex::display( )

此時complex類的公用部分為:

public:

complex( )

complex(double r) //轉換建構函式

complex(double r,double i)

operator double( )//型別轉換函式

friend complex operator+ (complex c1,complex c2); //過載運算子「+」

void display( );

其餘部分不變。程式在編譯時出錯,原因是出現二義性。

類型別轉換(轉換建構函式 型別轉換運算子)

只有乙個引數的建構函式可以作為轉換建構函式,預設情況下會發生隱式轉換,但是如果你對轉換建構函式加上了關鍵字explicit,它就不允許隱式轉換,但是你可以通過static cast等進行強制轉換。而且只允許一步類型別轉換,什麼意思呢?比如乙個類str,它有乙個建構函式,這個建構函式只需要乙個引數,且...

c 型別轉換運算子

c 中有4個型別轉換運算子,使裝換過程更規範 dynamic cast type name expression 如果轉型失敗則返回0,即空指標。該運算子的用途是,使得能夠在類層次結構中進行向上轉換 由於 is a關係,這樣的型別轉換時安全的 而不允許其他轉換。二 const cast const ...

C 型別轉換運算子

隱式轉換,是針對不同型別之間的賦值和運算,函式呼叫傳遞引數 這些的轉換都是由編譯器自動完成 char ch int i ch 顯式轉換 由程式設計師在變數前面新增型轉換 char pc char pb void ps void pa 通過上述的兩種方式,c語言大部分的型別轉換都可以順利進行,c 繼承...