您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關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隱式類類型如何轉換”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。