強制類型轉換包括以下名字命名的強制類型轉換操作符:static_cast dynamic_cast const_cast reinterpret_cast 。
1、何時需要強制類型轉換
因為要覆蓋通常的標準轉換,所以需顯示使用強制類型轉換。下面的複合賦值:
double dval;
int ival;
ival *= dval; 為了與dval做乘法操作,需將ival轉換為double型,然後將乘法操作的double型結果截尾為int型,在賦值給ival。為了去掉將ival轉換為double型這個不必要的轉換,可通過如下強制將dval轉換為int型:
ival *= static_cast<int>(dval);
2、命名的強制類型轉換
命名的強制類型轉換符號的一般形式如下:
cast-name<type>(expression);其中cast-name為static_cast dynamic_cast const_cast reinterpret_cast 之一,type為轉換的目標類型,而expression則是被類型強制轉換的值。
3、dynamic_cast 支援運行時識別指標或引用所指向的對象。
4、const_cast將轉換掉運算式的const性質,例如,假設有函數string_copy,只有唯一的參數,為char*類型,我們對訪問函數時,如讓它接受const char *類型的參數,可通過const_cast用一個const值調用string_copy函數:
const char * pc_str;
char * pc = string_copy(const_cast<char *>(pc_str));
只有使用const_cast才能將const性質轉換掉。其他三種不行,會導致編譯時間錯誤。
5、static_cast 編譯器隱式執行的任何類型轉換都可以由static_cast顯式轉換。
6、reinterpret_cast 通常為運算元的位元模式提供較低層次的重新解釋。
例如: 對於下面的強制轉換:
int * ip;
char * pc = reinterpret_cast<char *>(ip);
程式員必須永遠記得pc所指向的真實對象其實是int型,而並非字元數組。任何假設pc是一般字元指標的應用都有可能帶來執行階段錯誤。