C++中 explicit的用法

轉自 http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5644573

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;

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容