《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理
C++ Primer中有這樣一句話:可以用單個實參來調(diào)用的構(gòu)造函數(shù)定義了從形參類型到該類類型的一個轉(zhuǎn)換。這句話用下面一段代碼表示為:
class A
{
A(B b);//單個實參的構(gòu)造函數(shù)
func(A a);
}
.....
A a;
B b;
a.func(b);//func函數(shù)本應(yīng)該接受A類型的實參,但是由于特殊構(gòu)造函數(shù)的存在,所以B類型的參數(shù)b借助這個特殊的構(gòu)造函數(shù)轉(zhuǎn)化為A類型對象,完成轉(zhuǎn)換。所以這條語句是正確的
從上述代碼段可以看出來,單個實參調(diào)用的構(gòu)造函數(shù)定義了類類型到其他類型的轉(zhuǎn)換,并且這種轉(zhuǎn)換是隱式發(fā)生的,這里有幾個關(guān)鍵字:單個實參,構(gòu)造函數(shù),隱式轉(zhuǎn)換。
隱式轉(zhuǎn)換的過程發(fā)生了什么?對象a并沒有參數(shù)類型為B的成員函數(shù),但是它有一個單一B類形參的構(gòu)造函數(shù),所以編譯時是不會報錯的。對于a.func(b)這條語句,編譯器會用這個特殊的構(gòu)造函數(shù),生成一個臨時對象,然后以臨時對象調(diào)用正規(guī)的 func(A a)函數(shù),func(A a)函數(shù)結(jié)束,臨時對象被注銷。
這種轉(zhuǎn)換到底好不好?因類而異,因使用的語境而異!你總有需要它的時候,也有不許要它的時候,語言默認是有這項功能的。但是,也可以通過關(guān)鍵字explicit阻止這種我們看不到的“優(yōu)化”!explicit關(guān)鍵字只能用在構(gòu)造函數(shù)身上,并且只需在函數(shù)的聲明時標(biāo)注即可,在類函數(shù)的定義時不需標(biāo)注該關(guān)鍵字。
上例中如果阻止借助構(gòu)造函數(shù)A(B b)發(fā)生隱式類型轉(zhuǎn)換,可對該構(gòu)造函數(shù)的聲明做如下處理:
explicit A (B b)
此時語句a.func(b)就要出錯了,但是我們可以顯式地使用構(gòu)造函數(shù),以上例為例,可以使用語句
a.func(A(b))
完成相同的功能,此時不涉及隱式轉(zhuǎn)換。A(b)生成臨時A類型對象,并且傳遞給函數(shù)func調(diào)用,一切循規(guī)蹈矩,沒有任何隱式的、程序員看不見的步驟。顯示的構(gòu)造函數(shù)中止了隱式地使用構(gòu)造函數(shù),任何構(gòu)造函數(shù)都可以顯式地創(chuàng)建臨時對象,這是它的權(quán)利,被explicit修飾的構(gòu)造函數(shù)也不例外。
對于隱式類類型轉(zhuǎn)換,《C++ Primer》作者有如下心得:通常,除非有明顯理由要定義隱式轉(zhuǎn)換,否則,單形參構(gòu)造函數(shù)應(yīng)該為explicit。將構(gòu)造函數(shù)設(shè)置為explicit可以避免錯誤,并且當(dāng)轉(zhuǎn)換有用時,用戶可以顯式地構(gòu)造對象。
到此這篇關(guān)于《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理的文章就介紹到這了,更多相關(guān)c++隱式類類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用C實現(xiàn)PHP擴展 Fetch_Url 類數(shù)據(jù)抓取的方法
該擴展是基于libcurl基礎(chǔ)實現(xiàn)的網(wǎng)頁數(shù)據(jù)抓取2013-04-04
QT編寫窗口插件實現(xiàn)調(diào)用窗口的自適應(yīng)
這篇文章主要為大家詳細介紹了QT編寫窗口插件實現(xiàn)調(diào)用窗口的自適應(yīng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06
C++實現(xiàn)LeetCode(83.移除有序鏈表中的重復(fù)項)
這篇文章主要介紹了C++實現(xiàn)LeetCode(83.移除有序鏈表中的重復(fù)項),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

