C++的類型轉換函數
reinterpret_cast、const_cast、static_cast和dynamic_cast 前三個類型轉換是在編譯時實現轉換,dynamic_cast是在運行時進行類型轉換的。
reinterpret_cast<new type>(expression)
const_cast< new type>( expression)
static_cast<new type>(expression)
dynamic_cast<newtype>(expression)
1、reinterpret_cast
reinterpret_cast將一個類型的指針轉換為另一個類型的指針,它也允許從一個指針轉換為整數類型。這種轉換不用修改指針變量值數據存放格式(不改變指針變量),而是在編譯時重新解釋指針的類型(操作結果只是簡單的從一個指針到別的指針的值的二進制拷貝。在類型之間指向的內容不做任何類型的檢查和轉換)。但不能用於非指針類型的轉換。
(1)轉換一個指針為其它類型的指針,能夠在非相關的類型之間轉換
class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);
(2)不能將const指針轉換為非const
const int* point =&j;
dm =reinterpret_cast<double*>(point);
(3)不能用於非指針類型的轉換
int i; double j = 2.1;
j =reinterpret_cast<int>(j);
(4)可以將一段buffer轉成一個類的對象指針,或者反過來。
class A;
A a;
char* pBuffer = reinterpret_cast<char*> (&a);
2、const_cast
const_cast用於const指針與普通指針間的相互轉換(將一個const指針轉換為對應指針類型的普通指針變量,也可以將一個普通指針變量轉換為一個const指針)。不能將非常量指針變量轉換為普通變量(從const轉為非const,或者volatile轉為非volatile)。
class C {};
const C *a = new C;
C *b = const_cast<C *>(a);
3、static_cast
static_cast主要用於基本類型間的相互轉換,和具有繼承關系間的類型轉換(將子類類型的指針轉換為父類類型的指針,也能夠轉換父類類型的指針為它的子類類型的指針)。
(1)用於替代C風格的顯式轉換和各種類型指針到void*的轉換
long b = (int) a;
long b =static_cast<int>(a);
(2)用於父類到子類指針的轉換
(3)不能在類層次外轉換,所以static_cast比C方式轉換安全。
float x;
Count<<static_cast<int>(x);//把x作為整型值輸出
4、dynamic_cast
dynamic_cast只能在繼承類對象的指針之間或引用的相互轉換,在運行時動態轉換。只用於對象的指針和引用。當用於多態類型時,它允許任意的隱式類型轉換以及相反過程,會檢查操作是否有效。指針間轉換失敗可以通過判斷是否為null來判斷,引用轉換失敗則拋出 bad_cast 異常。
(1)只有類中含有虛函數才能用dynamic_cast,因其是依賴於VTable來工作的。
(2)用於多態類型的轉換,比如從父類到子類的轉換。
(3)當明確知道子類的類型時,可用static_cast轉換,其效率高點。
class Car;
classCabriolet:public Car{};
classLimousline:public Car{};
voidf(Car *cp)
{
Cabriolet*p = dynamic_cast< Cabriolet > cp;
}