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

