C 型別轉換

2021-06-23 09:57:52 字數 3175 閱讀 9855

c語言型別轉換

在c語言裡用到的型別轉換方式,一般都是用強制型別轉換,語法:(型別說明符)(表示式),例如: (float)a 把a轉換為實型,(int)(x+y) 把x+y的結果轉換為整型。

c語言這種賦值時的型別轉換形式可能會使人感到不精密和不嚴格,因為不管表示式的值怎樣,系統都自動將其轉為賦值運算子左部變數的型別。

c++型別轉換

const_cast,字面上理解就是去const屬性。

static_cast,命名上理解是靜態型別轉換。如int轉換成char。

dynamic_cast,命名上理解是動態型別轉換。如子類和父類之間的多型型別轉換。

reinterpret_cast,僅僅重新解釋型別,但沒有進行二進位制的轉換。

const_cast:

該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。

#include using namespace std;

struct data;

int main(int argc, _tchar* argv)

; = 15; //error c3892: 「data1」: 不能給常量賦值

data &data2 = const_cast(data1);

data2.value = 20;

printf("data1.value = %d data2.value = %d\n",data1.value,data2.value);

const int a = 10;

int *b = const_cast(&a);

*b = 20;

printf("a = %d b == &a is %d\n",a,b == &a);

system("pause");

return 0;

}

dynamic_cast

有條件轉換,動態型別轉換,執行時型別安全檢查(轉換失敗返回null):

1. 安全的基類和子類之間轉換。

2. 必須要有虛函式。

3. 相同基類不同子類之間的交叉轉換。但結果是null。

class baseclass ; //基類必須有虛函式。保持多台特性才能使用dynamic_cast

};class derivedclass: public baseclass ;

};baseclass* pb =new derivedclass();

derivedclass *pd1 = static_cast(pb); //子類->父類,靜態型別轉換,正確但不推薦

derivedclass *pd2 = dynamic_cast(pb); //子類->父類,動態型別轉換,正確

baseclass* pb2 =new baseclass();

derivedclass *pd21 = static_cast(pb2); //父類->子類,靜態型別轉換,危險!訪問子類m_szname成員越界

derivedclass *pd22 = dynamic_cast(pb2); //父類->子類,動態型別轉換,安全的。結果是null

static_cast:

①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。

進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。

②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

③把空指標轉換成目標型別的空指標。(int* 轉 long* error c2440: 「static_cast」: 無法從「int *」轉換為「long *」)

④把任何型別的表示式轉換成void型別。

reinterpret_cast:

reinterpret_cast(expression)

type-id 必須是乙個指標、引用、算術型別、函式指標或者成員指標。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)

主要是將原位址的值重新強制定義為新型別。

reinterpret_cast與static_cast的型別轉換比較:

#include using namespace std;

class a

;class b

;class c:public a,public b

;int main(int argc, _tchar* argv)

執行結果:

c = 00392950,a1 = 00392950,b1 = 00392954

c = 00392950,a2 = 00392950,b2 = 00392950

a1.m_a = 1, b1.m_b = 2

a2.m_a = 1, b2.m_b = 1

由執行結果可以很明顯地看到,使用reinterpret_cast進行強制轉換的時候b2直接是從c的位址開始,將c轉換成了b2,而使用static_cast的時候,b1是進行了乙個sizeof(a)的乙個偏移量的位移,也就是說在多重繼承的情況下,將子類的物件指標轉換成基類物件指標,使用static_cast才是安全的。reinterpret_cast的目的是將型別重定義,除非你非常明確地希望指向的那一塊記憶體是希望定義到你要轉換的目標,否則慎用。

reinterpret_cast的乙個使用例子:

#include using namespace std;

typedef void(*funcptr)();

typedef int(*funcptr2)();

void fun1()

int fun2()

int main(int argc, _tchar* argv)

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...

C 型別轉換

在程式中,進行型別轉換是常見的事。那麼在 c 中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如 object objtest new newtype newtype newvalue newtype objtest 但是這樣轉換,有個嚴重的問題,就是在把 objtest 強轉換成 newt...

C 型別轉換

型別轉換是將一種型別的值對映為另一種型別的值。型別轉換實際上包含有自動隱含和強制的兩種。型別的自動隱式轉換 c 語言編譯系統提供的內部資料型別的自動隱式轉換規則如下 1.程式在執行算術運算時,低型別可以轉換為高型別。2.在賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給它。3.當在...