Effective C++學習筆記之explicit

關鍵字:

  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 }
相關文章
相關標籤/搜索