C++霧中風(fēng)景5:Explicit's better than implicit.聊聊Explicit.

關(guān)于Explicit還是Implicit一直是編程語(yǔ)言中能讓程序員們干起架的爭(zhēng)議。那些聰明的老鳥(niǎo)總是覺(jué)得Implicit的規(guī)則讓他們能夠一目十行撼短,減少樣板代碼的羈絆。而很多時(shí)候挺勿,Implicit的很多規(guī)則會(huì)讓新手或者是合作開(kāi)發(fā)的搭檔痛苦不堪曲横。文章的標(biāo)題也寫(xiě)明了筆者的態(tài)度,顯式的在代碼之中指明自己的意圖不瓶,會(huì)讓程序更加明晰禾嫉。所以也借今天這篇文章,我們來(lái)聊聊Explicit關(guān)鍵字蚊丐。

1.隱式類類型轉(zhuǎn)換

好吧熙参,先看一段代碼:
(為了簡(jiǎn)單起見(jiàn),我這里就沒(méi)有重載<<操作符了)

class A {
public:
    A(int s) {};
};

void printA(A a) {
    cout << "hello" << endl;
}

int main() {
    printA(10);
}

上面這段代碼是可以通過(guò)編譯運(yùn)行的吠撮,可能有些小伙伴會(huì)比較困惑尊惰,為蝦米這里printA函數(shù)明明需要接受的是一個(gè)A類型,但是傳入的一個(gè)int類型仍然能夠編譯通過(guò)泥兰。

這就被稱之為隱式類類型轉(zhuǎn)換弄屡,它存在于自定義的類構(gòu)造函數(shù)中。C++的編譯器會(huì)對(duì)只有一個(gè)參數(shù)的構(gòu)造函數(shù)也定義了一個(gè)隱式轉(zhuǎn)換鞋诗,將該構(gòu)造函數(shù)對(duì)應(yīng)數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換為該類對(duì)象膀捷。也就是說(shuō),上段代碼其實(shí)可以翻譯成下面的代碼:

class A {
public:
    A(int s) {};
};

void printA(A a) {
    cout << "hello" << endl;
}

int main() {
    printA(A(10));
}

這里10作為int類型的參數(shù)削彬,通過(guò)隱式的類類型轉(zhuǎn)換全庸,被默認(rèn)構(gòu)造了一個(gè)A類型的匿名對(duì)象秀仲,傳入了函數(shù)printA,所以代碼能夠正常的編譯運(yùn)行。顯然壶笼,這種類型的代碼是十分Confused神僵。所以我們來(lái)看看這么解決這個(gè)問(wèn)題的。

有一個(gè)折衷的解決方案覆劈,將代碼做下面的修改:

void printA(A &a) {
    cout << "hello" << endl;
}

這里通過(guò)引用類型就可以避開(kāi)這個(gè)陷阱保礼,因?yàn)榫幾g器不會(huì)構(gòu)造這個(gè)匿名對(duì)象的引用,所以此時(shí)的代碼是無(wú)法通過(guò)編譯的责语。

顯然炮障,這個(gè)方案改變了我們不使用引用類型的初衷,我們看看C++有木有更加優(yōu)雅的解決方案坤候。

2.Explicit關(guān)鍵字

explicit主要用于"修飾"構(gòu)造函數(shù)胁赢,使得它不用于程序中需要通過(guò)此構(gòu)造函數(shù)進(jìn)行"隱式"轉(zhuǎn)換的情況。指定此關(guān)鍵字白筹,需要隱式轉(zhuǎn)換方可進(jìn)行的程序?qū)⒉荒芫幾g通過(guò)智末。

class A {
public:
    explicit A(int s) {};
};

void printA(A a) {
    cout << "hello" << endl;
}

int main() {
    printA(10);  //無(wú)法通過(guò)編譯
}

這里我們添加了explicit關(guān)鍵字,阻止了編譯器的隱式類類型轉(zhuǎn)換徒河,讓代碼更加明晰了吹害。當(dāng)然,我們這里是可以使用static_cast關(guān)鍵字可以顯式的類型轉(zhuǎn)換虚青,通過(guò)代碼的編譯。

int main() {
    printA(static_cast<A>(32));
}

explicit關(guān)鍵字只對(duì)一個(gè)參數(shù)的構(gòu)造函數(shù)有效螺男,需要多個(gè)實(shí)參的構(gòu)造函數(shù)不能用于隱式類型轉(zhuǎn)換棒厘。

3.討論一下

  • Scala
    類型系統(tǒng)幾乎是Scala之中最復(fù)雜的內(nèi)容,Scala設(shè)計(jì)的討巧之處下隧,是通過(guò)implicit關(guān)鍵字,顯式的指定了隱式類類型轉(zhuǎn)換奢人。雖然隱式類類型轉(zhuǎn)換減少了很多冗余的代碼,但是這樣的設(shè)計(jì)會(huì)降低代碼的可讀性淆院。Scala也一直因?yàn)榭勺x性被詬病何乎,所以這樣的設(shè)計(jì),見(jiàn)仁見(jiàn)智土辩。

  • Golang
    如果是接口interface與Python是類似的鴨子類型支救,不需要什么隱式轉(zhuǎn)換了。
    而如果是struct類的話拷淘,那Golang就十分嚴(yán)格的執(zhí)行強(qiáng)類型的判斷各墨。不符合是不行的。

  • Java
    Java一直是拒絕這種Confuse做法的語(yǔ)言启涯,所以通過(guò)一大堆繁瑣的樣板代碼規(guī)避這樣的問(wèn)題贬堵。

“Explicit's better than implicit”恃轩。Explicit保證了代碼的可讀性和維護(hù)性。這點(diǎn)對(duì)于一個(gè)系統(tǒng)的工程性是很有幫助的黎做。Implicit的轉(zhuǎn)換容易帶來(lái)那種“看上去很美叉跛,但是非常容易出錯(cuò)”的 feature 。希望我們能夠告別對(duì)它的依賴蒸殿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筷厘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伟桅,更是在濱河造成了極大的恐慌敞掘,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楣铁,死亡現(xiàn)場(chǎng)離奇詭異玖雁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)盖腕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)赫冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人溃列,你說(shuō)我怎么就攤上這事劲厌。” “怎么了听隐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵补鼻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雅任,道長(zhǎng)风范,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任沪么,我火速辦了婚禮硼婿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禽车。我一直安慰自己寇漫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布殉摔。 她就那樣靜靜地躺著州胳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钦勘。 梳的紋絲不亂的頭發(fā)上陋葡,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音彻采,去河邊找鬼腐缤。 笑死捌归,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岭粤。 我是一名探鬼主播惜索,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剃浇!你這毒婦竟也來(lái)了巾兆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤虎囚,失蹤者是張志新(化名)和其女友劉穎角塑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體淘讥,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡圃伶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒲列。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窒朋。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝗岖,靈堂內(nèi)的尸體忽然破棺而出侥猩,到底是詐尸還是另有隱情,我是刑警寧澤抵赢,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布欺劳,位于F島的核電站,受9級(jí)特大地震影響铅鲤,放射性物質(zhì)發(fā)生泄漏杰标。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一彩匕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧媒区,春花似錦驼仪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宙攻,卻和暖如春奠货,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背座掘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工递惋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柔滔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓萍虽,卻偏偏與公主長(zhǎng)得像睛廊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杉编,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容