C++ explicit構(gòu)造函數(shù)實(shí)例解析
按照C語(yǔ)言默認(rèn)規(guī)定,只有一個(gè)參數(shù)的構(gòu)造函數(shù)也定義了一個(gè)隱式轉(zhuǎn)換,將該構(gòu)造函數(shù)對(duì)應(yīng)數(shù)據(jù)類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為該類(lèi)對(duì)象,如下面所示:
class String {
String ( const char* p ); // 用C風(fēng)格的字符串p作為初始化值
//…
}
String s1 = "hello"; //OK 隱式轉(zhuǎn)換,等價(jià)于String s1 = String("hello");
但是有的時(shí)候可能會(huì)不需要這種隱式轉(zhuǎn)換,如下:
class String {
String ( int n ); //本意是預(yù)先分配n個(gè)字節(jié)給字符串
String ( const char* p ); // 用C風(fēng)格的字符串p作為初始化值
//…
}
下面兩種寫(xiě)法比較正常:
String s2 ( 10 ); //OK 分配10個(gè)字節(jié)的空字符串 String s3 = String ( 10 ); //OK 分配10個(gè)字節(jié)的空字符串
下面兩種寫(xiě)法就比較疑惑了:
String s4 = 10; //編譯通過(guò),也是分配10個(gè)字節(jié)的空字符串 String s5 = 'a'; //編譯通過(guò),分配int('a')個(gè)字節(jié)的空字符串
s4 和s5 分別把一個(gè)int型和char型,隱式轉(zhuǎn)換成了分配若干字節(jié)的空字符串,容易令人誤解。
為了避免這種錯(cuò)誤的發(fā)生,我們可以聲明顯示的轉(zhuǎn)換,使用explicit 關(guān)鍵字:
class String {
explicit String ( int n ); //本意是預(yù)先分配n個(gè)字節(jié)給字符串
String ( const char* p ); // 用C風(fēng)格的字符串p作為初始化值
//…
}
加上explicit,就抑制了String ( int n )的隱式轉(zhuǎn)換,
下面兩種寫(xiě)法仍然正確:
String s2 ( 10 ); //OK 分配10個(gè)字節(jié)的空字符串 String s3 = String ( 10 ); //OK 分配10個(gè)字節(jié)的空字符串
下面兩種寫(xiě)法就不允許了:
String s4 = 10; //編譯不通過(guò),不允許隱式的轉(zhuǎn)換 String s5 = 'a'; //編譯不通過(guò),不允許隱式的轉(zhuǎn)換
因此,某些時(shí)候,explicit 可以有效得防止構(gòu)造函數(shù)的隱式轉(zhuǎn)換帶來(lái)的錯(cuò)誤或者誤解
explicit只對(duì)構(gòu)造函數(shù)起作用,用來(lái)抑制隱式轉(zhuǎn)換。如:
class A{
A(int a);
};
int Function(A a);
當(dāng)調(diào)用 Function(2) 的時(shí)候,2 會(huì)隱式轉(zhuǎn)換為 A 類(lèi)型。這種情況常常不是程序員想要的結(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ò)誤。
總結(jié):explicit只對(duì)構(gòu)造函數(shù)起作用,用來(lái)抑制隱式轉(zhuǎn)換。
相關(guān)文章
Linux下C語(yǔ)言的幾道經(jīng)典面試題小結(jié)(分享)
下面小編就為大家?guī)?lái)一篇Linux下C語(yǔ)言的幾道經(jīng)典面試題小結(jié)(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))
下面小編就為大家?guī)?lái)一篇常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
C語(yǔ)言員工業(yè)績(jī)銷(xiāo)售源代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言員工業(yè)績(jī)銷(xiāo)售源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
C++中實(shí)現(xiàn)fibonacci數(shù)列的幾種方法
本文主要介紹了C++中實(shí)現(xiàn)fibonacci數(shù)列的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
linux c 查找使用庫(kù)的cflags與libs的方法詳解
本篇文章是對(duì)在linux中使用c語(yǔ)言查找使用庫(kù)的cflags與libs的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
OpenCV4.1.0+VisualStudio2019開(kāi)發(fā)環(huán)境搭建(超級(jí)簡(jiǎn)單)
這篇文章主要介紹了OpenCV4.1.0+VisualStudio2019開(kāi)發(fā)環(huán)境搭建(超級(jí)簡(jiǎn)單),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
詳細(xì)談?wù)凜語(yǔ)言中動(dòng)態(tài)內(nèi)存
在C語(yǔ)言中,編寫(xiě)程序的時(shí)候不能確定內(nèi)存的大小,希望程序在運(yùn)行的過(guò)程中根據(jù)數(shù)據(jù)量的大小動(dòng)態(tài)的分配內(nèi)存,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中動(dòng)態(tài)內(nèi)存的相關(guān)資料,需要的朋友可以參考下2022-03-03
C++ explicit關(guān)鍵字的應(yīng)用方法詳細(xì)講解
C++ explicit關(guān)鍵字用來(lái)修飾類(lèi)的構(gòu)造函數(shù),表明該構(gòu)造函數(shù)是顯式的,既然有"顯式"那么必然就有"隱式",那么什么是顯示而什么又是隱式的呢?下面就讓我們一起來(lái)看看這方面的知識(shí)吧2013-09-09

