C 型別轉換函式 與 explicit

2021-10-05 11:29:22 字數 2434 閱讀 9220

在c++中,可以使用建構函式將乙個指定型別的資料轉換為類的物件,也可以使用型別轉換函式 (type conversion function)將乙個類物件轉換為其他型別的資料。

我們直接通過乙個簡單的**介紹轉換函式:

#include

using

namespace std;

class

fraction

operator

double()

const

private

:int m_numerator;

// 分子

int m_denominator;

// 分母};

intmain

(void

)

我們設計了乙個分數(fraction)類,該類有兩個私有變數,分別表示分子和分母。建構函式有兩個引數,第二個引數預設為1。

在主函式中,定義了乙個分數類的物件 f,分子為 3,分母為 5。然後將 3.2 + f 的值設定為變數 d。

3.2 是乙個浮點型別的變數,而 f 是乙個fraction型別的變數,因此不能直接相加,於是編譯器會到分數類中尋找,找到了 operator double 函式,該函式可以將型別物件轉換為乙個浮點型別的變數。因此該函式就是我們所說的型別轉換函式(type conversion function)。通過分數類中的轉換函式,我們給出轉換函式的一般形式:

operator 型別名稱(

)const

1、轉換函式必須是類的成員函式

2、轉換函式不能宣告返回型別

3、形參列表必須為空

4、型別轉換函式通常應該是 const

型別轉換運算子是隱式執行的,因此物件f就擁有了雙重型別,既可以是類型別,也可以是double型別。

既然可以呼叫型別轉換函式將該 fraction 型別轉換為double型別,那麼也可以通過過載 + 將 double 型別轉換為類型別。因此該類的**如下:

class

fraction

fraction operator+(

const fraction& f)

private

:int m_numerator;

int m_denominator;};

intmain

(void

)

當我們將 f + 3.2 的值賦值給 d 例項時,3.2 就通過建構函式轉換為 fraction 型別,然後呼叫 operator + 函式將兩個例項加起來賦值給 d 物件。

但是如果同時存在型別轉換函式,會發生什麼情況呢?我們加入型別轉換函式:

#include

using

namespace std;

class

fraction

/* explicit */

operator

double()

const

fraction operator+(

const fraction& f)

private

:int m_numerator;

int m_denominator;};

intmain

(void

)

如果編譯上述的**就會立刻報錯:

ambiguous overload for 『operator+』 (operand types are 『fraction』 and 『double』)

因為存在了二義性。我們來具體分析以下:

1、f 物件可以通過型別轉換函式將類型別轉換為 double 型別,然後加上 3.2 賦值給 d。

2、3.2 也可以通過建構函式將 double 型別轉換為 fraction 型別,然後兩個類型別相加,又可以通過型別轉換函式轉換為 double 型別,所以這種方法也可以。

因此,以上兩種方式都可以,所以編譯器會報二義性的錯誤。

解決的辦法就是,使用explicit關鍵字的限制,使用方法也有兩種:

1、直接在建構函式前加上 explicit 關鍵字,防止 double 型別的變數隱式的轉換為類型別。

2、在轉換建構函式 operator double 前加上 explicit 關鍵字,表示只有顯示的將類型別轉換為 double 型別時才呼叫該函式。

double d =

static_cast

<

double

>

(f)+

3.2

後面的方法是c++11新引入的顯示的型別轉換運算子。

我們要盡量避免有二義性的型別轉換,如果類中包含乙個或多個型別轉換,則必須確保在類型別和目標型別之間只存在唯一一種轉換方式,否則將出現二義性。

C 型別轉換函式

2202.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std class test 在函式名前面不能指定函式型別,函式沒有引數 下面的例子函式名是 operator int operator int private int m...

C 型別轉換函式

include using namespace std class fraction fraction num 0 den 1 fraction int n,int d num n den d if 1 operator double catch const char msg else double...

c 型別轉換函式

一.opertor 本類型別 其他型別 內建型別或其他類型別 c 中opertor可以將類型別轉換為內建型別或其他型別,但反之不行 operator 型別名 1 classa2 7operator int 無返回值型別,無引數,返回目標型別的物件8 9void main 10二.轉換建構函式 其他型...