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