轉換函式 及 explicit關鍵字

2022-07-15 15:15:10 字數 1780 閱讀 5200

轉換函式vsnon-explicit-one-argument建構函式

類的轉換函式,是可以將該類型別轉換為其他型別(自定義或內建)的一種過載函式。一般定義成 operator double() const; (可以將double換乘任意型別)。

注:const也可以不新增,新增是因為轉換函式大多不會修改類成員變數,加上在例項化const

型別時,依然可以呼叫該函式。

當類的建構函式只有乙個argument(argument數量不同於引數列表中引數(parameter)的數量,可以理解為必須要傳遞的最少實引數)時,這種one argument建構函式,在合理的情況下會將第乙個引數型別的變數轉換成類型別。即可以將int型變數隱性的轉換為fraction型別。當在one argument建構函式前加上explicit關鍵字時(explicit關鍵字只對有乙個引數的類建構函式有效),該建構函式就被定義為顯式建構函式,可以防止類建構函式的隱式自動轉換。

注:盡量將one argument

建構函式定義為顯示型別,以避免不合時宜的隱性轉換。

class

fraction

operator

double() const

//型別轉換函式

fraction

operator+(const fraction&f)

~fraction() {};

private

:

intm_numberator;

intm_denominator;

};

fraction f(8, 5

);double d = 4 +f;

fraction d = 4 +f;

fraction d = f + 4;

分析上述**:

1. 在double d = 4 + f;

中編譯器在遇到全域性操作符函式+時,發現有運算元為 fraction型別,不是+函式的輸入引數型別,進而去尋找是否有可以將fraction類轉換成int或double的型別轉換函式。找到fraction

定義了double,則呼叫。

2. 在fraction d = 4 + f;中4+f的操作編譯器的處理和1相同,在完成+計算得到double型別資料後,又呼叫隱式建構函式fraction(int num, int den=1)

。若在建構函式前邊加上explicit關鍵字(如注釋部分),則變成顯示

建構函式(explicit-one-argument建構函式),此時在呼叫fraction d = 4 + f;則會出錯:「初始化」: 無法從「double」轉換為「fraction」  。

3. 在fraction d = f + 4;中會出錯:「fraction::operator +」: 2 個過載有相似的轉換。

出錯原因:在遇到操作符+時,a.可以呼叫fraction的操作符過載函式fraction operator+(const fraction&f)

,則需要將4通過隱式構造轉換成fraction

型別,再做+操作;b.也可以將+看作全域性操作符,此時又可以將f轉換成double,進行+操作。因為a,b兩種都可行,所以編譯器無法自動選擇哪種方式執行,故報錯。

此時將fraction類中的double或者+過載函式去掉,再編譯是可以通過的,即切斷一種可以編譯的途徑,使其不能按照該方式編譯。

參考:侯捷的c++課程

C 關鍵字之explicit與轉換建構函式

首先,c 中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯示的,而非隱式的,跟它相對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下即宣告為implicit 隱式 那麼顯示宣告的建構函式和隱式宣告的有什麼區別呢?我們來看下面的例子 c...

隱式轉換與explicit關鍵字

class person person const int age int main 上述 能夠正常執行。class person person const int age person const int age,int b 0 int main 上述 不能正常執行,生成可執行程式時,會報錯 無法...

C 型別轉換函式 與 explicit

在c 中,可以使用建構函式將乙個指定型別的資料轉換為類的物件,也可以使用型別轉換函式 type conversion function 將乙個類物件轉換為其他型別的資料。我們直接通過乙個簡單的 介紹轉換函式 include using namespace std class fraction ope...