C 四種強制型別轉換操作

2022-09-15 13:36:10 字數 1852 閱讀 7605

1 reinterpret_cast

'reinterpret_cast'轉換乙個指標為其它型別的指標,也允許從乙個指標轉換為整數型別,反之亦然。

這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。

'reinterpret_cast'就像傳統的型別轉換一樣對待所有指標的型別轉換。

2 static_cast

'static_cast'執行非多型的轉換,用於代替c中通常的轉換操作。因此,被做為隱式型別轉換使用。

(1)用於基本的資料型別轉換(char,int),及指標之間的轉換。

(2)類層次中基類與子類成員函式指標的轉換。

(3)類層次結構中基類與子類指標或引用之間的轉換:  

上行轉換:子類指標或引用轉換成基類表示——安全。

下行轉換:基類指標或引用轉換成子類表示——危險(沒有動態型別檢查)。

實際上static_cast真正用處並不在指標和引用上,而在基礎型別和物件的轉換上 。 而基於基礎型別和物件的轉換都是其他三個轉換運算子所辦不到的。

3 dynamic_cast

與static_cast一樣,dynamic_cast的轉換也需要目標型別和源物件有一定的關係:繼承關係。 更準確的說,dynamic_cast是用來檢查兩者是否有繼承關係。因此該運算子實際上只接受基於類物件的指標和引用的類轉換。

對於從子類到基類的指標轉換,static_cast和dynamic_cast都是成功並且正確的(所謂成功是說轉換沒有編譯錯誤或者執行異常;所謂正確是指方法的呼叫和資料的訪問輸出是期望的結果),這是物件導向多型性的完美體現。而從基類到子類的轉換,static_cast和dynamic_cast都是成功的,但是正確性方面,我對兩者的結果都先進行了是否非空的判別:dynamic_cast的結果顯示是空指標,而static_cast則是非空指標。但很顯然,static_cast的結果應該算是錯誤的,子類指標實際所指的是基類的物件,而基類物件並不具有子類的方法。對於沒有關係的兩個類之間的轉換,輸出結果表明,dynamic_cast依然是返回乙個空指標以表示轉換是不成立的;static_cast直接在編譯期就拒絕了這種轉換。

總得說來,static_cast和reinterpret_cast運算子要麼直接被編譯器拒絕進行轉換,要麼就一定會得到相應的目標型別的值。 而dynamic_cast卻會進行判別,確定源指標所指的內容,是否真的合適被目標指標接受。如果是否定的,那麼dynamic_cast則會返回null。這是通過檢查"執行期型別資訊"(runtime type information,rtti)來判定的,它還受到編譯器的影響,有些編譯器需要設定開啟才能讓程式正確執行,因此dynamic_cast也就不能用傳統的轉換方式來實現了。

在c++的面對物件思想中,虛函式起到了很關鍵的作用,當乙個類中擁有至少乙個虛函式,那麼編譯器就會構建出乙個虛函式表(virtual method table)來指示這些函式的位址,假如繼承該類的子類定義並實現了乙個同名並具有同樣函式簽名(function siguature)的方法重寫了基類中的方法,那麼虛函式表會將該函式指向新的位址。此時多型性就體現出來了:當我們將基類的指標或引用指向子類的物件的時候,呼叫方法時,就會順著虛函式表找到對應子類的方法而非基類的方法。

如果基類或者子類沒有任何虛函式(如果基類有虛函式表,子類當然是自動繼承了該錶),當他們作為dynamic_cast的源型別進行轉換時,編譯也會失敗。

如果要用繼承,那麼一定要讓析構函式是虛函式;如果乙個函式是虛函式,那麼在子類中也要是虛函式。

4 const_cast

const_cast轉換符是用來移除變數的const或volatile限定符。對於const變數,我們不能修改它的值,這是這個限定符最直接的表現。

C 四種強制型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...

C 四種強制型別轉換

1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...

C 四種強制型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...