1. 程式人生 > 程式設計 >《C++ Primer》隱式類型別轉換學習整理

《C++ Primer》隱式類型別轉換學習整理

C++ Primer中有這樣一句話:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的一個轉換。這句話用下面一段程式碼表示為:

class A
{
  A(B b);//單個實參的建構函式
  func(A a);
} 
.....
A a;
B b;
a.func(b);//func函式本應該接受A型別的實參,但是由於特殊建構函式的存在,所以B型別的引數b藉助這個特殊的建構函式轉化為A型別物件,完成轉換。所以這條語句是正確的

從上述程式碼段可以看出來,單個實參呼叫的建構函式定義了類型別到其他型別的轉換,並且這種轉換是隱式發生的,這裡有幾個關鍵字:單個實參,建構函式,隱式轉換。

隱式轉換的過程發生了什麼?物件a並沒有引數型別為B的成員函式,但是它有一個單一B類形參的建構函式,所以編譯時是不會報錯的。對於a.func(b)這條語句,編譯器會用這個特殊的建構函式,生成一個臨時物件,然後以臨時物件呼叫正規的 func(A a)函式,func(A a)函式結束,臨時物件被登出。

這種轉換到底好不好?因類而異,因使用的語境而異!你總有需要它的時候,也有不許要它的時候,語言預設是有這項功能的。但是,也可以通過關鍵字explicit阻止這種我們看不到的“優化”!explicit關鍵字只能用在建構函式身上,並且只需在函式的宣告時標註即可,在類函式的定義時不需標註該關鍵字。

上例中如果阻止藉助建構函式A(B b)發生隱式型別轉換,可對該建構函式的宣告做如下處理:

explicit A (B b)

此時語句a.func(b)就要出錯了,但是我們可以顯式地使用建構函式,以上例為例,可以使用語句

a.func(A(b))

完成相同的功能,此時不涉及隱式轉換。A(b)生成臨時A型別物件,並且傳遞給函式func呼叫,一切循規蹈矩,沒有任何隱式的、程式設計師看不見的步驟。顯示的建構函式中止了隱式地使用建構函式,任何建構函式都可以顯式地建立臨時物件,這是它的權利,被explicit修飾的建構函式也不例外。

對於隱式類型別轉換,《C++ Primer》作者有如下心得:通常,除非有明顯理由要定義隱式轉換,否則,單形參建構函式應該為explicit。將建構函式設定為explicit可以避免錯誤,並且當轉換有用時,使用者可以顯式地構造物件。

到此這篇關於《C++ Primer》隱式類型別轉換學習整理的文章就介紹到這了,更多相關c++隱式類型別轉換內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!