型別轉換
1. static_cast(靜態轉換)
編譯的時候就會進行型別轉換,程式碼中要保證轉換的安全性和正確性
可用於:
- 相關型別轉換,比如:整型和實型之間的轉換
- 子型別轉成父類型別(向上轉型)
- void * 與其它型別指標之間的轉換(void *:無指標型別,可以指向任何指標型別(萬能指標))
double f = 100.34f;
int j = static_cast<int>(f);
class A {}
class B : public A{}
B b;
A a = static_cast<A>(b); // 把子類轉成父類的物件
// 萬能指標
int i = 10;
int *p = &i;
void * q = static_cast<void *>(p); // int * 轉成 void *
int * db = static_cast<int *>(q);
2. dynamic_cast(第三章第十節)
3. const_cast
去除指標 或者引用的 const 屬性。該轉換能夠將 const 效能轉換掉,編譯時就會進行型別轉換
const int a = 10;
// int b = const_cast<int *>(a); a 既不是指標,也不是引用,不能轉
const int *pa = &a;
int * pa2 = const_cast<int *>(pa); // 語法正確
*pa2 = 120; // 這種寫值行為,是屬於一種未定義行為,不要這麼做
4. reinterpret_cast(不建議使用)
重新解釋:將運算元內容解釋為另一種不同的型別【能把運算元的型別都轉了】
處理無關型別的轉換:也就是2個轉換型別之間沒有什麼關係,就等於可以亂轉,自由轉,怎麼轉都行,很隨意
常用於如下兩種轉換:
- 將一個整型(地址)轉換成指標,一種型別指標轉換成另一種型別指標,按照轉換後的內容重新解釋記憶體中的內容
- 也可以從一個指標型別轉換成一個整型
int i = 10;
int *pi = &i;
int *p2 = reinterpret_cast<int *>(&i);
int *pc = reinterpret_cast<char *>(pi);