Effective C++學習筆記之explicit
阿新 • • 發佈:2018-08-21
rom const ack 聲明 col 這樣的 隱式轉換 轉換 類型
關鍵字:
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> 2using 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 }
Effective C++學習筆記之explicit