C 強制型別轉換

2021-07-07 10:44:45 字數 1953 閱讀 7972

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...