C++四種強制轉換


C語言的強制轉換為在數據面前之間加數據類型進行轉換,即(目標數據類型)原數據類型。c++為了更好的區分強制轉換的類型,達到見其名知其意的效果,共將強制轉換分為四種,即

1、static_cast<目標數據類型>原數據類型

2、const_cast<目標數據類型>原數據類型

3、reinterpret_cast<目標數據類型>原數據類型

4、dynamic_cast<目標數據類型>原數據類型

 

 

解析

static_cast<>()

1)用於類層次結構中基類和派生類之間指針或引用的轉換
      進行上行轉換(把派生類的指針或引用轉換成基類表示)是安全的
      進行下行轉換(把基類的指針或引用轉換為派生類表示),由於沒有動態類型檢查,所以是不安全的


 2)用於基本數據類型之間的轉換,如把int轉換成char。這種轉換的安全由開發人員來保證


 3)把空指針轉換成目標類型的空指針


 4)把任何類型的表達式轉換為void類型


    注意:static_cast不能轉換掉expression的const、volitale或者__unaligned屬性。

 

 static_cast:可以實現C++中內置基本數據類型之間的相互轉換。

 

    如果涉及到類的話,static_cast只能在有相互聯系的類型中進行相互轉換,不一定包含虛函數。

 

const_cast<>()

 

cost_cast即用於強制轉換指針或者引用constvolatile限制,特別注意的是,const_cast不是用於去除變量的常量性,而是去除指向常數對象的指針或引用的常量性,其去除常量性的對象必須為指針或引用。

      常量指針被轉化成非常量指針,並且仍然指向原來的對象;
      常量引用被轉換成非常量引用,並且仍然指向原來的對象;常量對象被轉換成非常量對象。

1、變量為常量,指針也為常量

 

 結果:

 

2、變量為普通變量,指針為常量

 

 

結果:

 

 

 

reinterpret_cast<>()

reinterpret_cast運算符用於處理無關類型之間的轉換,他會產生一個新的值,這個值會有與原始參數(原數據類型)有完全相同的比特位

  • 從指針類型到一個足夠大的整數類型
  • 從整數類型或者枚舉類型到指針類型
  • 從一個指向函數的指針到另一個不同類型的指向函數的指針
  • 從一個指向對象的指針到另一個不同類型的指向對象的指針
  • 從一個指向類函數成員的指針到另一個指向不同類型的函數成員的指針
  • 從一個指向類數據成員的指針到另一個指向不同類型的數據成員的指針

 

dynamic_cast<>()

 

(1)其他三種都是編譯時完成的,dynamic_cast是運行時處理的,運行時要進行類型檢查。

(2)不能用於內置的基本數據類型的強制轉換。

(3)dynamic_cast轉換如果成功的話返回的是指向類的指針或引用,轉換失敗的話則會返回NULL。

(4)使用dynamic_cast進行轉換的,基類中一定要有虛函數,否則編譯不通過。

        基類中需要檢測有虛函數的原因:類中存在虛函數,就說明它有想要讓基類指針或引用指向派生類對象的情況,此時轉換才有意義。

       
        這是由於運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數表(關於虛函數表的概念,詳細可見<Inside c++ object model>)中,

        只有定義了虛函數的類才有虛函數表。

 

 (5)在類的轉換時,在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的。在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。

        向上轉換,即為子類指針指向父類指針(一般不會出問題);向下轉換,即將父類指針轉化子類指針。

       向下轉換的成功與否還與將要轉換的類型有關,即要轉換的指針指向的對象的實際類型與轉換以后的對象類型一定要相同,否則轉換失敗。

        在C++中,編譯期的類型轉換有可能會在運行時出現錯誤,特別是涉及到類對象的指針或引用操作時,更容易產生錯誤。Dynamic_cast操作符則可以在運行期對可能產生問題的類型轉換進行測試。

 

 

 

參考:https://www.cnblogs.com/Allen-rg/p/6999360.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM