C++ explicit關(guān)鍵字與隱式類型轉(zhuǎn)換

C++ explicit關(guān)鍵字只能用于類內(nèi)部的構(gòu)造函數(shù)的聲明上,且只能作用于“單個(gè)參數(shù)的構(gòu)造函數(shù)”或“有多個(gè)參數(shù),但其它參數(shù)都有默認(rèn)值,只有一個(gè)參數(shù)無(wú)默認(rèn)值的構(gòu)造函數(shù)”,在使用被修飾后的構(gòu)造函數(shù)定義對(duì)象時(shí),無(wú)法發(fā)生相應(yīng)的隱式類型轉(zhuǎn)換。

隱式類型轉(zhuǎn)換

在C++中,如果一個(gè)類只有一個(gè)參數(shù)的構(gòu)造函數(shù),C++允許一種特殊的聲明類變量的方式,在這種情況下,可以直接將一個(gè)對(duì)應(yīng)于構(gòu)造函數(shù)參數(shù)類型的數(shù)據(jù)直接賦值給類變量,編譯器在編譯時(shí)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換,將對(duì)應(yīng)于構(gòu)造函數(shù)參數(shù)類型的數(shù)據(jù)轉(zhuǎn)換為類的對(duì)象。如下例所示:

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í)編程過(guò)程中常用到的對(duì)象定義方式,而方式三即是特殊的方式,因?yàn)镃/C++是一種強(qiáng)類型語(yǔ)言,不同的數(shù)據(jù)類型是不能隨意轉(zhuǎn)換的,如果要進(jìn)行類型轉(zhuǎn)換,必須進(jìn)行顯示強(qiáng)制類型轉(zhuǎn)換,而這里,沒(méi)有進(jìn)行任何顯示的轉(zhuǎn)換,直接將一個(gè)整形數(shù)據(jù)賦值給類類變量p3。
因此,可以說(shuō),方式三中進(jìn)行了一次隱式類型轉(zhuǎn)換,編譯器自動(dòng)將對(duì)應(yīng)于構(gòu)造函數(shù)參數(shù)類型的數(shù)據(jù)轉(zhuǎn)換為了該類的對(duì)象,因此方式三經(jīng)編譯器自動(dòng)轉(zhuǎn)換后和方式一最終的實(shí)現(xiàn)方式是一樣的。

explicit關(guān)鍵字

explicit關(guān)鍵字的作用就是禁止隱式轉(zhuǎn)換這個(gè)特性,如文章一開(kāi)始而言,凡是用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é)果,所以,要避免之,就可以這樣寫(xiě):

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ù),如:

  1. constructor(typename value);
  2. construcor(typename value1,typename value2=defaultvalue,typename value3=defaultvalue,...) ;

因?yàn)閮蓚€(gè)參數(shù)的構(gòu)造函數(shù)幾乎沒(méi)辦法隱式的轉(zhuǎn)換,即無(wú)法出現(xiàn)classtype classname = value的情況。

參考文章

1. CSDN | cbNotes | cbNotes的專欄:不積跬步,無(wú)以至千里 | C++關(guān)鍵字explicit的詳解和使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容