四種類型轉換

C語言支持類型強制轉換,C++爲什麼要引入其他類型轉換,原因如下:

 1、C風格的轉換格式很簡單,但是有不少缺點的:

(1)轉換太過隨意,可以在任意類型之間轉換。你可以把一個指向const對象的指針轉換成指向非const對象的指針,把一個指向基類對象的指針轉換成一個派生類對象的指針,這些轉換之間的差距是非常巨大的,但是傳統的C語言風格的類型轉換沒有區分這些。
(2)C風格的轉換沒有統一的關鍵字和標示符。對於大型系統,做代碼排查時容易遺漏和忽略。

2、C++風格完美的解決了上面兩個問題。

(1)對類型轉換做了細分,提供了四種不同類型轉換,以支持不同需求的轉換;
(2)類型轉換有了統一的標示符,利於代碼排查和檢視。下面分別來介紹這四種轉換:static_cast、dynamic_cast、const_cast和reinterpre_cast.

1、static_cast

使用方法:

static_cast<type-id> expression

作用:

(1)用於類層次結構中基類和派生類之間指針或引用的轉換

     派生類---->基類:安全。
     基類---->派生類:由於沒有動態類型檢查,所以是不安全的。

(2)用於基本數據類型之間的轉換,如把int轉換爲char,這種帶來安全性問題由程序員來保證
(3)把空指針轉換成目標類型的空指針
(4)把任何類型的表達式轉爲void類型
使用特點:
(1)主要執行非多態的轉換操作,用於代替C中通常的轉換操作
(2)隱式轉換都建議使用static_cast進行標明和替換

2、dynamic_cast轉換

使用方法:

dynamic_cast<type-id> expression
條件:

必須是指針、繼承關係的類型指針、有RTTI

作用:

只有在派生類之間轉換時才使用dynamic_cast,type-id必須是類指針,類引用或者void*。
使用特點:
(1)基類必須要有虛函數,因爲dynamic_cast是運行時類型檢查,需要運行時類型信息,而這個信息是存儲在類的虛函數表中,只有一個類定義了虛函數,纔會有虛函數表。
(2)對於基類--->派生類的轉換,dynamic_cast是安全的(當類型不一致時,轉換過來的是空指針),而static_cast是不安全的(當類型不一致時,轉換過來的是錯誤意義的指針,可能造成踩內存,非法訪問等各種問題)
(3)dynamic_cast還可以進行交叉轉換

示例:

父類:A

子類:B

A* a = new A();

B* b = new B();

b = dynamic_cast<B*>(a);//a中的RTTI是A*,將其轉換爲B*,類型不一致,因此將a轉換成NULL指針

假如改爲:A* a = new B();

B = dynamic_cast<B*>(a);//a中的RTTI是B*,將其轉換爲B*,類型一致,轉換成功

3、const_cast

使用方法:

const_cast<type-id>expression
作用:

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

使用特點: 

 cosnt_cast是四種類型轉換符中唯一可以對常量進行操作的轉換符
去除常量性是一個危險的動作,儘量避免使用。一個特定的場景是:類通過const提供重載時,一般都是非常量函數調用const_cast<const T>將參數轉換爲常量,然後調用常量函數,然後得到結果再調用const_cast <T>去除常量性。

4、reinterpret_cast

使用方法:

reinterpret_cast<type-id>expression

作用:

       用來處理無關類型轉換的,通常爲操作數的位模式提供較低層次的重新解釋!但是他僅僅是重新解釋了給出的對象的比特模型,並沒有進行二進制的轉換!

      用在任意的指針之間的轉換,引用之間的轉換,指針和足夠大的int型之間的轉換,整數到指針的轉換。 

使用特點:

        reinterpret_cast是爲了映射到一個完全不同類型的意思,這個關鍵詞在我們需要把類型映射回原有類型時用到它。我們映射到的類型僅僅是爲了故弄玄虛和其他目的,這是所有映射中最危險的。(這句話是C++編程思想中的原話)  

  • reinterpret_cast是從底層對數據進行重新解釋,依賴具體的平臺,可移植性差 
  • reinterpret_cast可以將整型轉換爲指針,也可以把指針轉換爲數組
  • reinterpret_cast可以在指針和引用裏進行肆無忌憚的轉換

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章