1、
static_cast
任何只要具有明確定義的型別轉換,只要不包含底層const就可以使用
static_cast
當需要把乙個較大的算數型別賦值給乙個較小的算數型別,
static_cast非常有用。
此時,強制型別轉換告訴程式的讀者和編譯器:我們不在乎潛在的精度損失。一般來說,如果編譯器發現乙個較大算數型別試圖賦值給乙個較小的型別,會給出警告資訊,但是我們執行了顯式的型別轉換後警告資訊就會關閉。
static_cast對於編譯器無法自動執行的型別轉換也非常有用。例如我們可以通過
static_cast找回存在於void *
指標中的值。
void *p = &a; //正確,任何非常量物件的位址都可以存入void*
double *ap = static_cast(p)
2、const_cast
const_cast只能改變運算物件的底層const_cast.
只有const_cast能改變表示式的常量屬性,使用其他形式的強制型別轉換改變表示式常量屬性將引發編譯器錯誤,同樣的,不能用const_cast改變表示式的型別。
const char *cp;
char *q = static_cast(cp); //錯誤,static_cast不能去const屬性
static_cast(cp); //正確
const_cast(cp); //錯誤,const_cast只能改變常量屬性
3、reinterpret_cast
reinterpret_cast通常為運算物件的位模式提供較低層次上的重新解釋。
例如:
int *ip;
char *pc = reinterpret_cast(ip);
我們必須牢記pc所指向的真實物件是乙個int而非字元,如果把pc當做普通的字元指標使用就可能在執行時發生錯誤。例如
string str(pc);
可能導致異常的執行時行為。
使用interpret_cast是非常危險的,轉換過程編譯器不會給出人警告,因為是顯示的強制型別轉換。
4、dynamic_cast
dynamic_cast運算子用於將基類的指標或引用安全的轉換成派生類的指標或引用。
使用形式如下:
dynamic_cast(e); //type必須是乙個類型別,e必須是乙個有效的指標
dynamic_cast(e); //e必須是乙個左值
dynamic_cast(e); //e不能是左值
1)指標型別的dynamic_cast
假設base類至少含有乙個虛函式,drived是base的共有派生。如果有乙個指向base的指標bp,則我們可以執行時將它轉換成指向drived的指標。如下:
執行時,如果bp指向derived物件,則轉換成功,if語句內的**執行是安全的。
否則,轉換結果為0,執行else語句內。
原因在於實際傳入
的引數對
象可以是base也可以是derived,這是由於動態繫結造成的。
2)引用型別的dynamic_cast
引用型別的dynamic_cast和指標型別的在表示錯誤發生的方式上有所不同,因為不存在所謂的空引用。
當對引用型別轉換失敗時,程式丟擲乙個std::bad_cast異常,該異常定義在typeinfo標頭檔案中。
c 強制轉化
強制轉化四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。2004 11 27 9 00 強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型...
c 強制轉化
強制轉化四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。2004 11 27 9 00 強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型...
c 強制轉化
dynamic cast 通常在基類和派生類之間轉換時使用,run time cast const cast 主要針對const和volatile的轉換.static cast 一般的轉換,no run time check.通常,如果你不知道該用哪個,就用這個。reinterpret cast 用...