C++中 explicit顯示轉換__C++

來源:互聯網
上載者:User

explicit 是避免建構函式的參數自動轉換為類對象的標識符

[cpp]  view plain  copy #include <iostream>   using namespace  std;      class A   {   public:           explicit A(int a)       {           cout<<"建立類成功了!"<<endl;                 }                    };   int main()   {          A a=10;       return 0;   }  

 

上面的代碼編譯不成功,原因是當顯式地定義了一個帶一個參數的建構函式( 帶explicit),必須要顯示地調用建構函式,

A a(10);

如果不加 explicit的話

A a=10;

實際的轉換過程如下:
相當於直接調用A(10);

(1)

explicit

此關鍵字只能對使用者自己定義的對象起作用,不對預設建構函式起作用
此關鍵字只能夠修飾建構函式。而且建構函式的參數只能有一個。。

(2)何時用explicit

當我們不希望自動類型轉換的時候用,其實標準庫好多建構函式都是explicit的

比如說vector <int> ivec(10);  //這種定義看起來一目瞭然

不能寫成vector <int> ivec=10;//此種定義讓程式員感到疑惑

(3)何時不用explicit

當我們需要隱式轉換的時候

比如說String類的一個建構函式

String(const char*);

 

定義成這樣的好處,在需要隱式轉化的時候編譯器會自動地幫我們轉換,標準庫裡面的String就是一個好的證明。

具體來說:

 

我們可以這樣String str="helloworld";//直接調用建構函式

 

String str="hello"+str+"world";

 

調用重載的+操作符號,此過程相當於:
String temp("hello"); //調用建構函式

String str=temp+str;

String t("world");//調用建構函式

String str=str+t;

 

 

明白隱式轉換在我們自己寫類的時候,尤其是些操縱記憶體的類的時候很有用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.