轉換建構函式 複製建構函式 操作符過載

2021-06-19 08:10:34 字數 3457 閱讀 8165



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

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

operator double( )

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

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

//預設建構函式

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

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

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( );

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

區別建構函式,複製建構函式和賦值操作符函式

定義example類,該類給出了建構函式,複製建構函式和賦值操作符函式,各個成員函式輸出自己的函式名。主函式裡以不同方式使用example物件。作為非引用形參,引用形參,動態分配,函式返回值,賦值操作,作vector容器元素,以此研究建構函式,複製建構函式和賦值操作符函式。ifndef test h...

建構函式 複製建構函式 析構函式 賦值操作符的總結

建構函式 複製構 造函式 析構函式 賦值操作符這幾個概念是c 中乙個類裡面的幾個基本函式,作為初學者的我對這幾個概念比較生疏,對其用法也有些疑問,下面對這幾個基本的函式進行總結。這裡主要說明他們的含義以及何時需要使用者自己定義 和預設的有啥區別 建構函式 建構函式是特殊的成員函式,只要建立類型別的新...

複製建構函式與賦值操作符

乙個類裡是否需要複製建構函式?有時候答案是 是 如果你的類在建構函式裡分配了資源,則可能需要乙個顯式的複製建構函式來管理資源。有析構函式的類通常用析構函式來釋放建構函式分配的資源,這通常也說明需要乙個複製建構函式。如果需要複製建構函式,則多半需要乙個賦值操作符。類x的賦值由x operator 來定...