關鍵字:
explicit意思為“明確的”和“清楚的”,是C++的關鍵詞,意在阻止隱式類型的轉換;
使用原因:
有時候不合法的隱式轉換,會讓乖巧聽話的程式變得不可控。所以適當地使用explicit關鍵字是有必要的。
如 string str = 'a'; 這樣的賦值是不能通過編譯,錯誤原因是 invalid conversion from ‘char’ to ‘const char*,也就是“不能做隱式char->const char轉換”。
注意事項:
1、只能用於類內部建構函式的聲明前,不能用於類外部建構函式的實現前;
2、只能作用於建構函式的一個參數、或者有預設值的多個參數。
用途舉栗:
現有一個testDog的函數,函參是一個Dog類的對象。Dog類只提供了一個設定成員變數age的建構函式。
1、傳入name的建構函式,沒有使用explicit關鍵字,直接對testDog傳入一個string或者char *,也能得到想要的輸出。其中隱式地將 "Huskie" 轉換為一個“name = Huskie,age = 0”的Dog類對象。
2、傳入age的建構函式,使用了explicit關鍵字,參數傳入int型的2會編譯不過,表示“不能做隱式int->Dog轉換”。將Dog(2)當做函參傳入就會解決此問題。
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 }