c++的型別轉換函式
reinterpret_cast
、const_cast
、static_cast
和dynamic_cast
前三個型別轉換是在
編譯時實現轉換
,dynamic_cast
是在執行時進行型別轉換的。
reinterpret_cast
(expression)
const_cast< new type>( expression)
static_cast(expression)
dynamic_cast(expression)
1、reinterpret_cast
reinterpret_cast將乙個型別的指標轉換為另乙個型別的指標,它也允許從乙個指標轉換為整數型別。這種轉換不用修改指標變數值資料存放格式(不改變指標變數),而是在編譯時重新解釋指標的型別
(操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換)。
但不能用於非指標型別的轉換。 (
1)轉換乙個指標為其它型別的指標,能夠在非相關的型別之間轉換
class a {};
class b {};
a * a = new a;
b * b = reinterpret_cast(a);(2
)不能將
const
指標轉換為非
const
const int* point =&j;
dm =reinterpret_cast(point);
(3)不能用於非指標型別的轉換
int i; double j = 2.1;
j =reinterpret_cast(j);(4
)可以將一段
buffer
轉成乙個類的物件指標,或者反過來。
class a;
a a;
char* pbuffer = reinterpret_cast(&a);
2、const_cast
const_cast用於
const指標與普通指標間的相互轉換(將乙個
const
指標轉換為對應指標型別的普通指標變數,也可以將乙個普通指標變數轉換為乙個
const
指標)。
不能將非常量指標變數轉換為普通變數(
從const
轉為非const
,或者volatile
轉為非volatile)。
class c {};
const c *a = new c;
c *b = const_cast(a);
3、static_cast
static_cast主要用於基本型別間的相互轉換,和具有繼承關係間的型別轉換(將子類型別的指標轉換為父類型別的指標,也能夠轉換父類型別的指標為它的子類型別的指標)。
(1)用於替代c風格的顯式轉換和各種型別指標到void*的轉換
long b = (int) a;
long b =static_cast(a);(2
)用於父類到子類指標的轉換
(3)不能在類層次外轉換,所以static_cast比c方式轉換安全。
float x;
count<(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)
C 的型別轉換函式
c 的型別轉換函式 reinterpret cast const cast static cast 和dynamic cast 前三個型別轉換是在 編譯時實現轉換 dynamic cast 是在執行時進行型別轉換的。reinterpret cast expression const cast new...
C 型別轉換函式
2202.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std class test 在函式名前面不能指定函式型別,函式沒有引數 下面的例子函式名是 operator int operator int private int m...
C 型別轉換函式
include using namespace std class fraction fraction num 0 den 1 fraction int n,int d num n den d if 1 operator double catch const char msg else double...