c 強制轉化

2022-07-29 22:54:22 字數 2336 閱讀 8612

1. 

static_cast

用法:static_cast < type-id > ( expression ) 

該運算子把expression轉換為type-id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法:

①用於類層次結構中基類和子類之間指標或引用的轉換。

進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成子類表示)時,由於沒有動態型別檢查,所以是不安全的。

②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

③把空指標轉換成目標型別的空指標。

④把任何型別的表示式轉換成void型別。

注意:static_cast不能轉換掉expression的const、volitale、或者__unaligned屬性。

2. dynamic_cast

用法:dynamic_cast < type-id > ( expression )

該運算子把expression轉換成type-id型別的物件。type-id必須是類的指標、類的引用或者void *;

如果type-id是類指標型別,那麼expression也必須是乙個指標,如果type-id是乙個引用,那麼expression也必須是乙個引用。

dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。

在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;

在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。

注意:這裡要求派生類中要有

虛函式

,否則編譯不能夠通過。而static_cast則無此要求。

3. reinpreter_cast

用法:reinpreter_cast < type-id > ( expression )

type-id必須是乙個指標、引用、算術型別、函式指標或者成員指標。

它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。

該運算子的用法比較多。

4. const_cast

用法:const_cast < type-id > ( expression )

該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。

常量指標被轉化成非常量指標,並且仍然指向原來的物件;

常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件被轉換成非常量物件。

dynamic_cast可用於繼承體系中的向下轉型,即將基類指標轉換為派生類指標,比static_cast更嚴格更安全。dynamic_cast在執行效率上比static_cast要差一些,但static_cast在更寬上範圍內可以完成對映,這種不加限制的對映伴隨著不安全性。static_cast覆蓋的變換型別除類層次的靜態導航以外,還包括無對映變換、窄化變換(這種變換會導致物件切片,丟失資訊)、用void*的強制變換、隱式型別變換等...

****************************************==

static_cast

vs reinterpret_cast

****************************************==

static_cast 和 reinterpret_cast 操作符修改了運算元型別。它們不是互逆的; static_cast 在編譯時使用型別資訊執行轉換,在轉換執行必要的檢測(諸如指標越界計算, 型別檢查). 其運算元相對是安全的。另一方面;reinterpret_cast 僅僅是重新解釋了給出的物件的位元模型而沒有進行二進位制轉換, 例子如下:

int n=9; double d=static_cast < double > (n); 

上面的例子中, 我們將乙個變數從 int 轉換到 double。 這些型別的二進位制表示式是不同的。 要將整數 9 轉換到 雙精度整數 9,static_cast 需要正確地為雙精度整數 d 補足位元位。其結果為 9.0。而reinterpret_cast 的行為卻不同:

int n=9; 

double d=reinterpret_cast (n);

這次, 結果有所不同. 在進行計算以後, d 包含無用值. 這是因為 reinterpret_cast 僅僅是複製 n 的位元位到 d, 沒有進行必要的分析. 

因此, 你需要謹慎使用 reinterpret_cast.

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