Effective C++學習筆記之explicit

來源:互聯網
上載者:User
關鍵字:

  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 }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.