C 型別轉換

2021-09-24 13:27:01 字數 4047 閱讀 3695

用轉換建構函式可以將乙個指定型別的資料轉換為類的物件。但是不能反過來將乙個類的物件轉換為乙個其他型別的資料(例如將乙個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( )

對程式的分析:

1) 如果在complex類中沒有定義型別轉換函式operator double,程式編譯將出錯。因為不能實現double 型資料與complex類物件的相加。現在,已定義了成員函式 operator double,就可以利用它將complex類物件轉換為double型資料。請注意,程式中不必顯式地呼叫型別轉換函式,它是自動被呼叫的,即隱式呼叫。在什麼情況下呼叫型別轉換函式呢?編譯系統在處理表示式 2.5 +cl 時,發現運算子「+」的左側是double型資料,而右側是complex類物件,又無運算子「+」過載函式,不能直接相加,編譯系統發現有對double的過載函式,因此呼叫這個函式,返回乙個double型資料,然後與2.5相加。

2) 如果在main函式中加乙個語句:

c3=c2;

請問此時編譯系統是把c2按complex類物件處理呢,還是按double型資料處理?由於賦值號兩側都是同一類的資料,是可以合法進行賦值的,沒有必要把c2轉換為double型資料。

3) 如果在complex類中宣告了過載運算子「+」函式作為友元函式:

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

若在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( )

int main( )

注意,在visual c++ 6.0環境下執行時,需將第一行改為#include ,並刪去第2行,否則編譯不能通過。

對程式的分析:

1) 如果沒有定義轉換建構函式,則此程式編譯出錯。

2) 現在,在類complex中定義了轉換建構函式,並具體規定了怎樣構成乙個複數。由於已過載了算符「+」,在處理表示式c1+2.5時,編譯系統把它解釋為

operator+(c1, 2.5)

由於2.5不是complex類物件,系統先呼叫轉換建構函式complex(2.5),建立乙個臨時的complex類物件,其值為(2.5+0i)。上面的函式呼叫相當於

operator+(c1, complex(2.5))

將c1與(2.5+0i) 相加,賦給c3。執行結果為

(5.5+4i)

3) 如果把「c3=c1+2.5;」改為c3=2.5+c1; 程式可以通過編譯和正常執行。過程與前相同。

從中得到乙個重要結論,在已定義了相應的轉換建構函式情況下,將運算子「+」函式過載為友元函式,在進行兩個複數相加時,可以用交換律。

如果運算子函式過載為成員函式,它的第乙個引數必須是本類的物件。當第乙個運算元不是類物件時,不能將運算子函式過載為成員函式。如果將運算子「+」函式過載為類的成員函式,交換律不適用。

由於這個原因,一般情況下將雙目運算子函式過載為友元函式。單目運算子則多過載為成員函式。

4) 如果一定要將運算子函式過載為成員函式,而第乙個運算元又不是類物件時,只有乙個辦法能夠解決,再過載乙個運算子「+」函式,其第乙個引數為double型。當然此函式只能是友元函式,函式原型為

friend operator+(double, complex &);

顯然這樣做不太方便,還是將雙目運算子函式過載為友元函式方便些。

5) 在上面程式的基礎上增加型別轉換函式:

operator double( )

此時complex類的公用部分為:

public:

complex( )

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

complex(double r,double i)

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

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

void display( );

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

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...

C 型別轉換

在程式中,進行型別轉換是常見的事。那麼在 c 中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如 object objtest new newtype newtype newvalue newtype objtest 但是這樣轉換,有個嚴重的問題,就是在把 objtest 強轉換成 newt...

C 型別轉換

型別轉換是將一種型別的值對映為另一種型別的值。型別轉換實際上包含有自動隱含和強制的兩種。型別的自動隱式轉換 c 語言編譯系統提供的內部資料型別的自動隱式轉換規則如下 1.程式在執行算術運算時,低型別可以轉換為高型別。2.在賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給它。3.當在...