在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二.轉換建構函式 其他型...