explicit關鍵字:用於防止單參數構造函數的隱式轉換功能(多參數構造函數不會執行隱式轉換)
class myDig {
int value;
public:
explicit myDig(int n) {
value = n;
}
}
void doSomething(myDig num); //函數,接受一個myDig參數,函數體不重要,故省略
void Test1() {
myDig dig1; // 錯誤,沒有默認構造函數
doSomething(dig1); // 正確
myDig dig2(10); // 正確
doSomething(10); // 錯誤,myDig不支持隱式轉換
doSomething(myDig(10)); //正確,調用**類型轉換操作符**進行顯示轉換(也叫轉型,cast), 調用myDig構造函數。
}
/*
* 如果去掉explicit則doSomething(10)正確, 執行了隱式轉換
* 過程相當於執行 myDig tmp(10); doSomething(tmp);
*
* myDig dig3 = 10; //正確,也是隱式轉換。
* /
在Effective c++中
被聲明爲explicit的構造函數通常比其non-explicit兄弟更受歡迎,因爲它們禁止編譯器執行非預期(往往也不被期望)的類型轉換。