C++中4個與型別轉換相關的關鍵字
阿新 • • 發佈:2018-12-26
static_cast
const_cast
dynamic_cast
reinterpret_cast
一.型別轉換
表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。在C++中,某些型別之間存在相關的依賴關係。若兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或值。如果兩個型別之間可以相互轉換,則稱這兩個型別相關。
“轉換”是一種編譯器指令,大部分情況下他不改變一個指標所含的真正地址,他隻影響“被指出之記憶體大小和其內容”的解釋方式。
二.四種與型別轉換相關的關鍵字
1.static_cast--運算子完成相關型別之間的轉換
在同一類層次結構中的一個指標型別到另一個指標型別,整形到列舉,浮點型到整形等。
例:
int m=0;
double n=static_cast<int>m;
int *p=static_cast<int*>(malloc(100));
2.const_cast--移除變數的const或volatile限定符
//volatile:指令關鍵字,確保本條指令不會因為編譯器的優化而省略,且要求每次直接讀值
3.dynamic_cast--處理基類到派生類的轉換(基類必須有虛擬函式,為多型時可以轉換)
它是執行時進行型別檢測的型別轉換,如果繫結到引用或指標的物件不是目標型別的物件,則dynamic——cast建立失敗。
將基類的指標或引用安全地轉換為派生類的指標或引用。當虛擬函式不能使用的時候,再使用dynamic_cast關鍵字,從基類指標獲得派生類行為。
class Base { public: virtual int test(){return 0;} //基類中存在虛擬函式,故在派生類中存在虛擬函式指標指向虛擬函式表。 }; class Derived:public Base { public: virtual int test(){return 1;} }; int main() { Base cbase; Derived cderived; Base *p1=new Base; Base *p2=new Derived; Derived* pD1=dynamic_cast<Derived*>(p1);//p1沒有真正指向派生類,pD1置為0 Derived* pD2=dynamic_cast<Derived*>(p2); //正確 //Derived& pd1=dynamic_cast<Derived&>(*p1);//p1沒有真正指向派生類,pd1丟擲異常 Derived& pd2=dynamic_cast<Derived&>(*p2);//正確 return 0; }
4.reinterpret_cast--處理互不相關型別之間的轉換
它可以轉換任何內建的資料型別為其他任何的資料型別,也可以轉換任何指標型別為其他的型別。他甚至可以轉換內建的資料型別為指標,無需考慮型別安全或者常量的情形,不到萬不得已不使用它。
int a=10;
double *b=reinterpret_cast<double*>(a)//b的轉換結果為0x0000000a