explicit意思爲「明確的」和「清楚的」,是C++的關鍵詞,意在阻止隱式類型的轉換;ios
有時候不合法的隱式轉換,會讓乖巧聽話的程序變得不可控。因此適當地使用explicit關鍵字是有必要的。函數
如 string str = 'a'; 這樣的賦值是不能經過編譯,錯誤緣由是 invalid conversion from ‘char’ to ‘const char*,也就是「不能作隱式char->const char轉換」。spa
一、只能用於類內部構造函數的聲明前,不能用於類外部構造函數的實現前;code
二、只能做用於構造函數的一個參數、或者有默認值的多個參數。對象
現有一個testDog的函數,函參是一個Dog類的對象。Dog類只提供了一個設置成員變量age的構造函數。blog
一、傳入name的構造函數,沒有使用explicit關鍵字,直接對testDog傳入一個string或者char *,也能獲得想要的輸出。其中隱式地將 "Huskie" 轉換爲一個「name = Huskie,age = 0」的Dog類對象。ci
二、傳入age的構造函數,使用了explicit關鍵字,參數傳入int型的2會編譯不過,表示「不能作隱式int->Dog轉換」。將Dog(2)當作函參傳入就會解決此問題。string
1 #include <iostream> 2 using namespace std; 3 4 class Dog 5 { 6 public: 7 string name; 8 int age; 9 10 explicit Dog(int age_) 11 { 12 name = "Huskie"; 13 age = age_; 14 } 15 Dog(const char* p) 16 { 17 name = p; 18 age = 0; 19 } 20 }; 21 22 void testDog(Dog onedog) 23 { 24 cout<<"Dog's name is :"<<onedog.name<<", age :"<<onedog.age<<endl; 25 } 26 27 int main() 28 { 29 string str = 'a';//invalid conversion from ‘char’ to ‘const char* 30 //即編譯出錯,不能作隱式char->const char轉換 31 32 Dog dog1 = 2;//編譯出錯,不能作隱式int->Dog轉換 33 Dog dog2 = "haha"; 34 35 cout<<"Test dog:"<<endl; 36 testDog("Shiba Inu"); 37 testDog(2);//編譯出錯,不能作隱式int->Dog轉換 38 testDog(Dog(2)); 39 return 0; 40 }