dynamic_cast:通常在積累和派生類之間轉換時使用
const_cast:主要針對const和volatile的轉換
static_cast:一般的轉換(no run-time check)通常,如果你不知道該用哪個,就用這個
reinterpret_cast:用於進行沒有任何關聯之間的轉換,比如乙個字元指標轉換成乙個整形數(char *---int)
1)dynamic_cast(a)
執行期處理。
其僅能應用於指標或者引用,不支援內建資料型別
如果型別t不是a的基型別,返回空指標。
它會在執行期,檢查被指標引用的物件的實際型別,確定轉換是否可行。所以,為了讓其正常工作,必須讓編譯器支援rtti(執行期型別資訊)
編譯期處理。
該運算子用來修改型別的const或volatile屬性。除了const或volatile修飾之外,type_id和expression必須是相同型別。
class a ;
void f()
const_cast操作不能在不同的種類間轉換。它僅僅把乙個它作用的表示式轉換成常量。它可以使乙個本來不是const型別的資料轉換成const型別,或者把const屬性去掉。
編譯期處理。
有如下幾種用法
①結構中基類(父類)和派生類(子類)之間指標或引用的轉換
進行上行轉換(把派生類的指標或引用轉換成基類表示pbase = pderived)--安全
進行下行轉換(把基類指標或引用轉換成派生類表示pderived = pbase)--不安全,因為沒有動態型別檢查
②基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。安全性由開發人員保證。
③把空指標轉皇城目標型別的空指標
④把任何型別的表示式轉換成void型別
注意:static_cast不能轉換掉expression的const、volatile、_unaligned屬性。
例子
int i;
float f = 166.71;
i = static_cast(f);
此事結果,i的值為166.
type_id必須是乙個指標、引用、
算術型別、函式指標或者成員指標。
它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。
例子:
int i;
char *p = "hello";
i = reinterpret_cast(p);
此時結果,i與p的值完全相同。reinterpret_cast的作用是將p的值以二進位制(位模式)的方式被解釋為整型,並賦給i。i也是指標,整型指標;乙個明顯的現象是在轉換前後沒有數字損失。
關於static_cast和reinterpret_cast的區別
class a ;
class b ;
class c : public a, public b {};
c c;
printf("%p, %p, %p", &c, reinterpret_cast(&c), static_cast (&c));
前兩個的輸出值是相同的,最後乙個則會在原基礎上便宜4個位元組,這是因為static_cast計算了父子類指標轉換的偏移量,並將之轉換到正確的位址,而reinterpret不會做這一層的轉換。
因此,需要謹慎使用reinterpret_cast.
C 強制型別轉換
四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...
C 強制型別轉換
標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...
C 強制型別轉換
關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast,dynamic cast,reint...