一、類型強轉 type cast
類型轉換有C風格,也有C++風格的。C風格的類型轉換簡單,可以在任意類型之間轉換,比如可以將一個指向const對象的指針轉換成指向非const對象的指針,或者將一個指向基類對象的指針轉換成指向派生類對象的指針,C語言對不同種類的轉換不加區分,還有一個缺點就是,C風格的轉換是括號加上一個標識符組成,不容易查找。C++爲了克服這些缺點,引進了4個新的強制類型轉換操作符。
1. 靜態類型轉換,static_cast<目標類型> (標識符)
在一個方向上可以作隱式轉換,在另外一個方向上就可以作靜態轉換。
2. 重解釋類型轉換,reinterpret_cast<目標類型> (標識符)
在雙方向上都不可以隱式類型轉換的,則需要重解釋類型轉換。
3. 脫常類型轉換,const_cast<目標類型> (標識符)
目標類型只能是指針或引用,用來移除對象的常量性(cast away the constness)。
使用 const_cast 去除 const 限定的目的不是爲了修改它的內容,通常是爲了函數能夠接受這個實際參數。
const 常變量(補充):C++中 const 定義的變量稱爲常變量。變量的形式,常量的作用,常用於取代 #define 宏常量。
4. 動態類型轉換,dynamic_cast<目標類型> (標識符)
用於多態中的父子類之間的強轉,只用於含有虛函數的父子類中。
二、type cast安全檢查對比
- static_cast,在一個方向上可以作隱式轉換的,在另外一個方向上可以作靜態轉換。發生在編譯階段,編譯期檢查,不保證後序使用的正確性。
- reinterpret_cast,無任何檢查,既不在編譯器期也不在運行期進行檢查,安全性完全由程序員決定。
- dynamic_cast,dynamic_cast 一種運行時的類型轉化方式,所以要在運行時作轉換判斷。在運行期檢查,檢查指針所指類型,然後判斷這一類型是否與正在轉換成的類型有一種 “is a”的關係,如果是,dynamic_cast 返回對象地址。如果不是,dynamic_cast 返回 NULL。dynamic_cast 常用多態繼承中,判斷父類指針的真實指向。