轉(zhuǎn)自 http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5644573
explicit 是避免構(gòu)造函數(shù)的參數(shù)自動轉(zhuǎn)換為類對象的標(biāo)識符
[cpp] view plain copy
include <iostream>
using namespace std;
class A
{
public:
explicit A(int a)
{
cout<<"創(chuàng)建類成功了!"<<endl;
}
};
int main()
{
A a=10;
return 0;
}
上面的代碼編譯不成功掌唾,原因是當(dāng)顯式地定義了一個帶一個參數(shù)的構(gòu)造函數(shù)( 帶explicit)辉巡,必須要顯示地調(diào)用構(gòu)造函數(shù),
A a(10)警绩;
如果不加 explicit的話
A a=10;
實(shí)際的轉(zhuǎn)換過程如下:相當(dāng)于直接調(diào)用A(10);
(1)
explicit
此關(guān)鍵字只能對用戶自己定義的對象起作用,不對默認(rèn)構(gòu)造函數(shù)起作用此關(guān)鍵字只能夠修飾構(gòu)造函數(shù)说铃。而且構(gòu)造函數(shù)的參數(shù)只能有一個。嘹履。
(2)何時用explicit
當(dāng)我們不希望自動類型轉(zhuǎn)換的時候用腻扇,其實(shí)標(biāo)準(zhǔn)庫好多構(gòu)造函數(shù)都是explicit的
比如說vector <int> ivec(10); //這種定義看起來一目了然
不能寫成vector <int> ivec=10;//此種定義讓程序員感到疑惑
(3)何時不用explicit
當(dāng)我們需要隱式轉(zhuǎn)換的時候
比如說String類的一個構(gòu)造函數(shù)
String(const char*);
定義成這樣的好處,在需要隱式轉(zhuǎn)化的時候編譯器會自動地幫我們轉(zhuǎn)換砾嫉,標(biāo)準(zhǔn)庫里面的String就是一個好的證明幼苛。
具體來說:
我們可以這樣String str="helloworld";//直接調(diào)用構(gòu)造函數(shù)
String str="hello"+str+"world";
調(diào)用重載的+操作符號,此過程相當(dāng)于:String temp("hello"); //調(diào)用構(gòu)造函數(shù)
String str=temp+str;
String t("world");//調(diào)用構(gòu)造函數(shù)
String str=str+t;
明白隱式轉(zhuǎn)換在我們自己寫類的時候焕刮,尤其是些操縱內(nèi)存的類的時候很有用舶沿。