explicit 關鍵字的用法
只有乙個引數的建構函式在預設情況下隱含乙個轉換操作符,對沒有引數或引數個數大於 1 個的建構函式沒有此問題(看後面的特別說明)
class x
int m_a;
int m_b;
double m_c;
};x::x(int a)
如果做如下呼叫
x x = 10; //10 被隱式轉化成了 x 物件,其實編譯器編譯後就是呼叫了建構函式 x(int)
double d1 = (double)0.5f;
x x2 = d1; //d1 被隱式轉化成了 x 物件,其實編譯器編譯後就是呼叫了建構函式 x(double c)
這裡要格式外說明的是,如果 x(double c) 前有 explicit,而 x(int) 前沒有,則
x x2 = d1; 會呼叫 x(int),而不是自己想像的呼叫 x(double c)
有時我們不需要隱式的轉化,就要用 explicit 限制下,把上面**的 explicit 開啟,則下面的呼叫就非法了,在函式中呼叫如下所示
void f(x x)
{}void g(int i)
void h()
特別要說明的是,如果乙個建構函式的引數為如下形式,也會存在隱式轉換的問題
class y
int m_a;
int m_b;
};總而言之一句,乙個類的建構函式只要用乙個引數能呼叫起來,都存在隱式轉換的問題,其它情況下沒有
關於explicit關鍵字的用法
explicit關鍵字的作用 禁止隱式呼叫類內的單引數建構函式,這主要包括如下三層意思 1 該關鍵字只能用來修飾類內部的建構函式 2 禁止隱式呼叫拷貝建構函式 3 禁止類物件之間的隱式轉換 關於explicit的隱式轉換,例子 class cexplict cexplict const cexpli...
C 關鍵字explicit的用法
explicit是顯示的意思。而且只能修飾建構函式。因為在類的建構函式中,凡是只帶乙個引數的建構函式,都定義了一組隱式轉化 把建構函式型別轉換為該類的型別。比如 class explicit virtual explicit 則 呼叫 explicit e 1 列印 explicit 建構函式 1 ...
C 關鍵字explicit的用法
c 關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生,宣告為explicit的建構函式不能在隱式轉換中使用。c 中,帶有乙個形參的建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是類的帶參建構函式 2 是預設且隱含的型別轉換操作符。...