前言
C風格的強制類型轉換(Type Cast)很簡單,不管什麼類型的轉換統統是:TYPE b = (TYPE)a。如
int a=1;
char b=(char)a;
這種轉換適用於面向過程的沒有類的概念的c語言的轉換,然而這樣的轉換符也能隨意地應用於類和類的指針,沒有安全檢查。
C++風格的類型轉換提供了4種類型轉換操作符來應對不同場合的應用:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在於控制類(class)之間的類型轉換。
代碼:
reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)
static_cast
用法:static_cast<type_id> (expression)
該轉換和c風格的轉換很類似,沒有運行時類型檢查,所以無法保證轉換的安全性。主要有以下幾種用法:
(1)用於基本數據類型,或者non_const到const(反過來必須用const_cast)
(2)把空指針轉換爲目標類型的指針
(3)將任何類型的表達式轉換爲void類型
(4)可以將子類類型的指針轉換爲父類類型的指針(這種轉換的安全性需要開發人員來保證)
(5) static_cast不能去掉類型的const、volitale屬性(用const_cast)。
dynamic_cast
用法:dynamic_cast<type*>(expression)
他只用於對象和引用,主要用於執行安全的向下轉型,他可以將指向子類的父類指針轉換爲子類指針,但是要求父類有虛函數,如果轉換爲指針類型失敗則返回NULL,如果是引用類型轉換失敗則跑出bad_cast的異常。
關於static_cast 和 dynamic_cast的區別:
a. static在轉換時不進行安全性檢查,完全需要開發者自己考慮, dynamic 在轉換的時候會進行安全性檢查,如果是指針類型的轉換失敗返回NULL,如果是引用類型的轉換失敗,則跑出bad_cast 異常。
b. static主要是用於值類型之間的轉換,而dynamic只能用於對象的指針和引用的cast,dynamic是向下的轉換,而且要求父類有虛函數,否則會編譯出錯。
const_cast
用法:const_cast<type_id> (expression)
用於修改類型的const或volatile屬性,一般用於強制消除對象的常量性,c中不提供消除這const的機制
reinpreter_cast
用法:reinpreter_cast<type_id> (expression)
type_id可以是指針,引用,算術類型,函數指針或者成員指針,這個操作符可以在非相關的類型之間轉換,操作只是簡單的從一個指針到別的指針的值得二進制拷貝,在類型之間指向的內容不作任何類型的檢查和轉換。
總 結
去const屬性用const_cast。
基本類型轉換用static_cast。
多態類之間的類型轉換用daynamic_cast。
不同類型的指針類型轉換用reinterpreter_cast。