c++與c語言一樣,有顯式和隱式兩種強制型別轉換(type cast)
在實際使用中,c++基本採用以下四種常用的強制型別轉換關鍵字:
static_cast
const_cast
einterpret_cast
dynamic_cast
一般來說,我們需要型別轉換的場景可以分為如下幾種:
在測試如上場景時,難點源於兩個方面:
該運算子把expression轉換為type-id型別,但沒有執行時型別檢查來保證轉換的安全性,因此需要我們自行判斷。它主要有如下幾種用途:
②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
③把空指標轉換成目標型別的空指標。
④把任何型別的表示式轉換成void型別。
注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性。const_cas主要作用是:修改型別的const或volatile屬性。
const_cast(expression)除了const 或volatile修飾之外, type_id和expression的型別是一樣的。
reinterpret_cast (expression)中的type-id 必須是乙個指標、引用、算術型別、函式指標或者成員指標。該操作符修改了運算元型別,但僅僅是重新解釋了給出的物件的位元模型而沒有進行二進位制轉換。
例如:
int
*n=new
int;
double
*d=reinterpret_cast
<
double
*>
(n);
在進行計算以後, d 包含無用值. 這是因為 reinterpret_cast 僅僅是複製 n 的位元位到 d, 沒有進行必要的分析。
它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。
static_cast和reinterpret_cast的區別主要在於多重繼承,比如:
classa;
classb;
classc:
public a,
public b
;
那麼對於以下**:
c c;
printf
("%p, %p, %p"
,&c,
reinterpret_cast
>
(&c)
,static_cast
>
(&c)
);
但是需要注意的是:
這是因為static_cast計算了父子類指標轉換的偏移量,並將之轉換到正確的位址(c裡面有m_a,m_b,轉換為b*指標後指到m_b處),而reinterpret_cast卻不會做這一層轉換。
因此, 你需要謹慎使用 reinterpret_cast.
dynamic_cast能把乙個基類物件指標(或引用)轉換到繼承類指標
dynamic_cast會根據基類指標是否真正指向繼承類指標來做相應處理
用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。
注意:為使dynamic_cast能正常使用:
四種強制型別的具體操作,可以參考該文
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 四種強制型別轉換
1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...