C++ explicit關(guān)鍵字只能用于類內(nèi)部的構(gòu)造函數(shù)的聲明上癞志,且只能作用于“單個(gè)參數(shù)的構(gòu)造函數(shù)”或“有多個(gè)參數(shù)往枷,但其它參數(shù)都有默認(rèn)值,只有一個(gè)參數(shù)無默認(rèn)值的構(gòu)造函數(shù)”凄杯,在使用被修飾后的構(gòu)造函數(shù)定義對象時(shí)错洁,無法發(fā)生相應(yīng)的隱式類型轉(zhuǎn)換。
隱式類型轉(zhuǎn)換
在C++中戒突,如果一個(gè)類只有一個(gè)參數(shù)的構(gòu)造函數(shù)屯碴,C++允許一種特殊的聲明類變量的方式,在這種情況下膊存,可以直接將一個(gè)對應(yīng)于構(gòu)造函數(shù)參數(shù)類型的數(shù)據(jù)直接賦值給類變量导而,編譯器在編譯時(shí)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換,將對應(yīng)于構(gòu)造函數(shù)參數(shù)類型的數(shù)據(jù)轉(zhuǎn)換為類的對象隔崎。如下例所示:
class People
{
public:
int age;
People (int a) { age=a; }
};
void foo ( void )
{
People p1(10); //方式一
People* p_p2=new People(10); //方式二
People p3=10; //方式三
}
該例中今艺,方式一和方式二都是平時(shí)編程過程中常用到的對象定義方式,而方式三即是特殊的方式爵卒,因?yàn)镃/C++是一種強(qiáng)類型語言虚缎,不同的數(shù)據(jù)類型是不能隨意轉(zhuǎn)換的,如果要進(jìn)行類型轉(zhuǎn)換技潘,必須進(jìn)行顯示強(qiáng)制類型轉(zhuǎn)換遥巴,而這里千康,沒有進(jìn)行任何顯示的轉(zhuǎn)換,直接將一個(gè)整形數(shù)據(jù)賦值給類類變量p3铲掐。
因此拾弃,可以說,方式三中進(jìn)行了一次隱式類型轉(zhuǎn)換摆霉,編譯器自動(dòng)將對應(yīng)于構(gòu)造函數(shù)參數(shù)類型的數(shù)據(jù)轉(zhuǎn)換為了該類的對象豪椿,因此方式三經(jīng)編譯器自動(dòng)轉(zhuǎn)換后和方式一最終的實(shí)現(xiàn)方式是一樣的。
explicit關(guān)鍵字
explicit關(guān)鍵字的作用就是禁止隱式轉(zhuǎn)換這個(gè)特性携栋,如文章一開始而言搭盾,凡是用explicit關(guān)鍵字修飾的構(gòu)造函數(shù),編譯時(shí)就不會(huì)進(jìn)行自動(dòng)轉(zhuǎn)換婉支,而會(huì)報(bào)錯(cuò)鸯隅。如下例所示:
class A
{
A(int a);
};
int Function(A a);
當(dāng)調(diào)用Function(2)的時(shí)候,2會(huì)隱式轉(zhuǎn)換為A類型向挖。這種情況常常不是程序員想要的結(jié)果蝌以,所以,要避免之何之,就可以這樣寫:
class A
{
explicit A(int a);
};
int Function(A a);
這樣跟畅,當(dāng)調(diào)用Function(2)的時(shí)候,編譯器會(huì)給出錯(cuò)誤信息(除非Function有個(gè)以int為參數(shù)的重載形式)溶推,這就避免了在程序員毫不知情的情況下出現(xiàn)錯(cuò)誤徊件。
注意:explicit關(guān)鍵字只是用于一個(gè)參數(shù)的構(gòu)造函數(shù),如:
- constructor(typename value)蒜危;
- construcor(typename value1,typename value2=defaultvalue,typename value3=defaultvalue,...) 虱痕;
因?yàn)閮蓚€(gè)參數(shù)的構(gòu)造函數(shù)幾乎沒辦法隱式的轉(zhuǎn)換,即無法出現(xiàn)classtype classname = value的情況舰褪。
參考文章
1. CSDN | cbNotes | cbNotes的專欄:不積跬步皆疹,無以至千里 | C++關(guān)鍵字explicit的詳解和使用