C 轉換建構函式和隱式轉換函式

2021-07-26 16:53:01 字數 3185 閱讀 7916

本文的所有內容均來自

今天是第一次聽到c++還有個轉換建構函式,之前經常見到預設建構函式、拷貝建構函式、析構函式,但是從沒聽說過轉換建構函式,隱式轉換函式也是一樣,c++的確是夠博大精深的,再次嘆服!

其實我們已經在c/c++中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成另一指定的型別,也即是強制轉換,比如:int a = int(1.23),其作用是將1.23轉換為整形1。然而對於使用者自定義的類型別,編譯

系統並不知道如何進行轉換,所以需要定義專門的函式來告訴編譯系統改如何轉換,這就是轉換建構函式和型別轉換函式!

一、轉換建構函式

轉換建構函式(conversion constructor function) 的作用是將乙個其他型別的資料轉換成乙個類的物件。

當乙個建構函式只有乙個引數,而且該引數又不是本類的const引用時,這種建構函式稱為轉換建構函式。

轉換建構函式是對建構函式的過載。

例如:[cpp] 

complex(double r)   

其作用是將double型的引數r轉換成complex類的物件,將r作為複數的實部,虛部為0。使用者可以根據需要定義轉換建構函式,在函式體中告訴編譯系統怎樣去進行轉換。

那麼如何使用轉換建構函式進行型別轉換呢?我們看如下的例子:

[cpp] 

// typeswitch.cpp : 定義控制台應用程式的入口點。  

//  

#include "stdafx.h"  

#include

using namespace std;  

class complex  

;  complex(double r, double i):real(r),imag(i){};  

complex(double r):real(r),imag(0){};  // 定義轉換建構函式  

void print()  

complex& operator+(complex c)  

private:  

double real;  

double imag;  

};  

int main(int argc, _tchar* argv)  

不僅可以將乙個標準型別資料轉換成類物件,也可以將另乙個類的物件轉換成轉換建構函式所在的類物件。如可以將乙個學生類物件轉換為教師類物件,可以在teacher類中寫出下面的轉換建構函式:

[cpp]  

teacher(student& s)  

使用方法同上!

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

2.如果不想讓轉換建構函式生效,也就是拒絕其它型別通過轉換建構函式轉換為本型別,可以在轉換建構函式前面加上explicit!例如:

[cpp] 

// typeswitch.cpp : 定義控制台應用程式的入口點。  

//  

#include "stdafx.h"  

#include

using namespace std;  

class complex  

;  complex(double r, double i):real(r),imag(i){};  

explicit complex(double r):real(r),imag(0){};  // explicit禁止建構函式的轉換功能  

void print()  

private:  

double real;  

double imag;  

};  

int main(int argc, _tchar* argv)  

二、型別轉換函式

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

型別轉換函式的作用是將乙個類的物件轉換成另一型別的資料。

如果已宣告了乙個complex類,可以在complex類中這樣定義型別轉換函式:

[cpp] 

operator double( )  

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

operator 型別名( )

注意事項:

1.在函式名前面不能指定函式型別,函式沒有引數。

2.其返回值的型別是由函式名中指定的型別名來確定的。

3.型別轉換函式只能作為成員函式,因為轉換的主體是本類的物件,不能作為友元函式或普通函式。

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

[cpp]  

// typeswitch.cpp : 定義控制台應用程式的入口點。  

//  

#include "stdafx.h"  

#include using namespace std;  

class complex  

;  

complex(double r, double i):real(r),imag(i){};  

complex(double r):real(r),imag(0){};  // 定義轉換建構函式  

void print()  

operator double()  

private:  

double real;  

double imag;  

};  

int main(int argc, _tchar* argv)  

本例中,對於d = c1 + 1.1;先呼叫型別轉換函式將c1轉為double型別,然後在與1.1相加!

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

C 轉換建構函式和隱式轉換函式

其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成另一指定的型別,也即是強制轉換,比如 int a int 1.23 其作用是將1.23轉換為整形1。然而對於使用者自定義的類型別,編譯 系統並不知道如何進行轉換,所以需要定義專門的函式來告訴編譯系...

建構函式隱式轉換

建構函式會引起乙個不引人注意的問題 用單個實參來呼叫的建構函式定義了從從形參型別到類型別的乙個隱式轉換。舉個例子說 cpp view plain copy class sales item sales item add sales item other sales item const std st...

建構函式 建構函式隱式轉換 拷貝建構函式

建構函式對於我們來說是比較熟悉的,c primer裡提到 類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,為 建構函式。例1 class fruit 定義乙個類,名字叫fruit 這樣的建構函式是我們比較常見的,但是如果變成 class fruit 定義乙個類,名字叫fruit 即使是乙個類...