C 的型別轉換函式

2021-09-09 04:02:57 字數 2582 閱讀 6478

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)

1reinterpret_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);

2const_cast

const_cast用於

const指標與普通指標間的相互轉換(將乙個

const

指標轉換為對應指標型別的普通指標變數,也可以將乙個普通指標變數轉換為乙個

const

指標)。

不能將非常量指標變數轉換為普通變數

從const

轉為非const

,或者volatile

轉為非volatile)。

class c {};

const c *a = new c;

c *b = const_cast(a);

3static_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

作為整型值輸出

4dynamic_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...