static_cast
reinterpret_cast
dynamic_cast
const_cast
1.**static_cast------運算符完成相關類型之間的轉換**
使用場景:如在同一類層次結構中的一個指針類型到另一個指針類型,整型到枚舉類型,或者浮點型到整型等。
例: 1, int m=10;
double n=static_cast < int > m;
2, int * q=static_cast < int* >(malloc(100));
2.**reinterpret_cast------處理互不相關類型之間的轉換**
使用場景:如從整型到指針,一種類型的指針到另一種類型的指針等
例: int a=10;
double* b=reinterpret_cast<double*>(a); //b的轉換結果為0x0000000a
3.**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,const_cast用來移除變量的const或volatile限定符。
一句話:強制去掉const(或volatile) 必須使用const_cast 。
注:
volatile的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.
簡單地說就是防止編譯器對代碼進行優化.比如如下代碼:
a=1;
a=2;
a=3;
a=4;
對外部硬件而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是編譯器卻會對上述四條語句進行優化,認為只有a=4(即忽略前三條語句,只產生一條機器代碼)。如果鍵入volatile,則編譯器會逐一的進行編譯並產生相應的機器代碼(產生四條代碼).