一.強制類型轉換
C++語言中提供了static_cast、const_cast、reinterpret_cast和dynamic_cast。這四個關鍵字都是用於強制類型轉換的。
二.static_cast
1.基本數據之間的轉換,如int轉化爲double
int a = 1;
double b = static_cast<double>(a);
2.用於類層次結構中基類和派生類之間指針或引用的轉換
①進行上行轉換(把派生類的指針或引用轉換成基類表示)是安全的
②進行下行轉換(把基類的指針或引用轉換爲派生類表示),由於沒有動態類型檢查,所以是不安全的
//寫兩個類,假如 Derive類繼承Basic
Basic *b = nullptr;
Derive *d = new Derive;
b = static_cast<Basic *> d;
3.把空指針轉換成目標類型的空指針
int *p;
void *m = malloc(sizeof(int));
p = static_cast<int *>m;
4.把任何類型的表達式轉換爲void類型
三.const_cast
cost_cast即用於強制轉換指針或者引用的const或volatile限制,特別注意的是,const_cast不是用於去除變量的常量性,而是去除指向常數對象的指針或引用的常量性,其去除常量性的對象必須爲指針或引用。
//錯誤例子
const int a = 2;
int b = const_cast<int>a; //錯誤,const_cast強制轉換的對象必須是指針或引用
//正確例子
int c = 2;
const int *d = &c;
int *e = const_cast<int *>d;
四.reinterpret_cast
reinterpret_cast運算符用於處理無關類型之間的轉換,他會產生一個新的值,這個值會有與原始參數(原數據類型)有完全相同的比特位。
1.從指針類型到一個足夠大的整數類型
2.從整數類型或者枚舉類型到指針類型
3.從一個指向函數的指針到另一個不同類型的指向函數的指針
4.從一個指向對象的指針到另一個不同類型的指向對象的指針
5.從一個指向類函數成員的指針到另一個指向不同類型的函數成員的指針
6.從一個指向類數據成員的指針到另一個指向不同類型的數據成員的指針
五.dynamic_cast
1.前面三種都是編譯時完成的強制轉換,dynamic_cast是運行時處理的。
2.不能用於內置的基本數據類型的強制轉換。
3.dynamic_cast轉換如果成功的話返回的是指向類的指針或引用,轉換失敗的話則會返回NULL。
4.使用dynamic_cast進行轉換的,基類中一定要有虛函數,否則編譯不通過。
5.在類的轉換時,在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的。在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
使用dynamic_cast進行向下強制類型轉換。使用此關鍵字有以下幾個條件:
①.必須有虛函數
②.必須打開編譯器的RTTI開關
③.必須有繼承關係