1. 程式人生 > >static_cast、dynamic_cast、reinterpret_cast、const_cast

static_cast、dynamic_cast、reinterpret_cast、const_cast

static_cast

1. 基礎型別之間互轉。如:float轉成int、int轉成unsigned int等

2. 指標與void*之間互轉。如:float*轉成void*、CBase*轉成void*、函式指標轉成void*、void*轉成CBase*等

3. 派生類指標【引用】轉成基類指標【引用】。如:Derive*轉成Base*、Derive&轉成Base&等

4. 非virtual繼承時,可將基類指標【引用】轉成派生類指標【引用】多繼承時,會做偏移處理)。如:Base*轉成Derive*、Base&轉成Derive&等

該運算子把expression轉換為type-id型別,但沒有執行時型別檢查來保證轉換的安全性。

用於類層次結構中基類和子類之間指標或引用的轉換。進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;進行下行轉換(把基類指標或引用轉換成子類表示)時,由於沒有動態型別檢查,所以是不安全的。

dynamic_cast  專門用於處理多型機制,對繼承體系內的物件(類中必須含有至少一個虛擬函式)的指標【引用】進行轉換,轉換時會進行型別檢查;vc在編譯時要帶上/EHsc /GR

如果能轉換會返回對應的指標【引用】;不能轉換時,指標會返回空,引用則丟擲std::bad_cast異常(const std::bad_cast& e)

注:由於std::bad_cast型別定義在typeinfo標頭檔案中,固需要#include<typeinfo>

另外,對於菱形非virtual繼承、非public繼承,轉換引用時也會丟擲std::bad_cast異常

reinterpret_cast  對指標【引用】進行原始轉換,不做任何偏移處理(當然:多繼承時,也不會做偏移處理

1. 將指標【引用】轉換成整型。如:float*轉成int、CBase*轉成int、float&轉成int、CBase&轉成int等

float f1 = 1.0f; CBase o1;
int n1 = reinterpret_cast<int>(&f1);
int n2 = reinterpret_cast<int>(&o1);
int n3 = reinterpret_cast<int&>(f1); int n4 = reinterpret_cast<int&>(o1);

2. 指標【引用】之間互轉。如:float*轉成int*、CBase&轉成int&、CBase*轉成CBase2*、CBase&轉成CBase2&等

float f1 = 1.0f;  CBase1 o1;
int* n1 = reinterpret_cast<int*>(&f1);
int& n2 = reinterpret_cast<int&>(o1);
CBase2* o21 = reinterpret_cast<CBase2*>(&o1);
CBase2& o22 = reinterpret_cast<CBase2&>(o1);

reinpreter_cast 是二進位制級別的型別轉換,不安全

const_cast   去掉或增加constvolatile特性

C型別強制轉換   形式:(type)objecttype(object)

最好是使用type(object);原因是:在某些編譯器下,(type)object不會呼叫建構函式,而type(object)下則肯定會呼叫建構函式

C型別強制轉換會按照以下順序進行嘗試轉換:

a. const_cast
b. static_cast
c. static_cast, then const_cast
d. reinterpret_cast
f. reinterpret_cast, then const_cast