C 四種常用的型別轉換機制

2021-07-15 04:03:56 字數 1484 閱讀 5682

在c語言中,我們常常使用 (type)expression 這樣的語句來把expression表示式強制轉換為type型別的資料,而在c++中我們引用了四種型別轉換操作符:const_cast,static_cast,dynamic_cast和reinterpret_cast;

1、static_cast 的威力和c語言的舊式轉型有相同的效果和相同的限制;

2、dynamic_cast 將指向基類物件的指標或者引用轉型為派生類(安全向下轉型),並且在轉型的過程中可以獲知轉型是否成功,對於指標,如果轉型失敗會返回乙個null指標,如果是對引用轉型失敗,會丟擲乙個bad_cast異常,dynamic_cast通常情況下應該用於包含虛函式的型別上(因為dynamic_cast操作符屬於執行時型別識別操作,所以我們需要虛函式表來記錄類的繼承關係,包括父類和派生類,只有在包含虛函式的情況下,編譯器才會為物件維護乙個虛函式表,所以應該必須包含乙個虛函式的型別才能運用此操作符!);

dynamic_cast  (e);   //指標轉換

dynamic_cast  (e);  //引用轉換

上面的兩個表示式必須符合以下三個條件中的任乙個:e的型別是目標type的公有派生類、e的型別是目標type的公有基類或者e的型別就是目標type的型別。

3、reinterpret_cast 該強制轉換操作符的轉換結果幾乎總是和編譯平台相關,所以不具有移植性,其最常用於函式指標的轉換,某些情況下這樣的轉型可能會導致不正確的結果,所以這種操作盡量別用。

4、const_cast  上面三種操作符都不能移除變數的const和 volatile的特性,只有該操作符能改變變數的這種特性;

可能出現的問題:

通過輸出我們可以發現,明明呼叫了reset()函式,卻發現x,y的值並沒有改變,只是z的值變化了;

當我們使用a::reset();函式時得到的結果如下:

可以發現x,y,z的值都變化了,因為當我們用強制轉換的時候得到了(*this)物件的副本,改變的也是副本的值,所以最終列印*this物件的資料成員時並沒有reset x,y的值,所以得到上述結果。

當我把static_cast(*this).reset()改為static_cast(this).reset();後通過指標的操作就可以得到正確的值,如下:

這進一步驗證了改變的是*this物件副本的理論。

C 型別轉換機制

可以分為隱式型別轉換和顯示型別轉換,顯示型別轉換也稱為強制型別轉換 cast 有四種名字命名的強制型別轉換操作符 static cast dynamic cast const cast reinterpret cast。隱式的型別轉換比較常見,在混合的型別表示式中經常發生。最簡單的為整型提公升,對於...

四種C 型別轉換

1 static cast 用法 static cast type id expression 該運算子把expression轉換為type id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法 用於類層次結構中基類和子類之間指標或引用的轉換。進行上行轉換 把子類的指標或引用轉換成...

C 四種強制型別轉換

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