C++中 explicit的用法
explicit 是避免建構函式的引數自動轉換為類物件的識別符號
上面的程式碼編譯不成功,原因是當顯式地定義了一個帶一個引數的建構函式( 帶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;
明白隱式轉換在我們自己寫類的時候,尤其是些操縱記憶體的類的時候很有用。