1. 程式人生 > >Effective C++學習筆記之explicit

Effective C++學習筆記之explicit

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>
 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 }

Effective C++學習筆記之explicit