C 型別轉換

2021-09-25 07:25:00 字數 3551 閱讀 3246

static_cast < type-id > ( expression )

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

//注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性

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

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

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

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

③ 指標與void*之間互轉。如:float*轉成void*、cbase*轉成void*、函式指標轉成void*、void*轉成cbase*等

c++中static_cast和reinterpret_cast的區別

c++primer第四版第五章裡寫了編譯器隱式執行任何型別轉換都可由static_cast顯示完成; reinterpret_cast通常為運算元的位模式提供較低層的重新解釋

① c++中的static_cast執行非多型的轉換,用於代替c中通常的轉換操作。因此,被做為顯式型別轉換使用。比如:

int i;

float f = 166.71;

i = static_cast(f);

//此時結果,i的值為166

② c++中的reinterpret_cast主要是將資料從一種型別的轉換為另一種型別。所謂「通常為運算元的位模式提供較低層的重新解釋」也就是說將資料以二進位制存在形式的重新解釋。比如:

int i;

char *p = "this is an example.";

i = reinterpret_cast(p);

//此時結果,i與p的值是完全相同的

reinterpret_cast的作用是說將指標p的值以二進位制(位模式)的方式被解釋為整型,並賦給i,i 為整型;乙個明顯的現象是在轉換前後沒有數字損失。

dynamic_cast (expression)

//該運算子把expression轉換成type-id型別的物件, type-id 必須是類的指標、類的引用或者void*。

//如果 type-id 是類指標型別,那麼expression也必須是乙個指標

//如果 type-id 是乙個引用,那麼 expression 也必須是乙個引用

dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換 (類中必須含有至少乙個虛函式)。

① 在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全,dynamic_cast 專門用於處理多型機制。vc在編譯時要帶上/ehsc /gr

class base;};

class child :public base {};

int main()

//當下行轉換安全時,即基類指標指標或者引用確實指向乙個派生類物件,這個運算子會傳回適當轉型過的指標

//當下行轉換不安全,即基類指標指標或者引用沒有指向乙個派生類物件,這個運算子會傳回空指標。

//當不能轉換時,如果是引用則丟擲std::bad_cast異常(const std::bad_cast& e)

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

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

② dynamic_cast還支援交叉轉換(cross cast)

classa

};class b:public a {};

class d:public a {};

void foo()

// 在函式foo中,使用static_cast進行轉換是不被允許的,將在編譯時出錯,而使用 dynamic_cast的轉換則是允許的,結果是空指標。

reinterpret_cast(expression)

//type-id 必須是乙個指標、引用、算術型別、函式指標或者成員指標。

//它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標

//(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。

操作符修改了運算元型別,但僅僅是重新解釋了給出的物件的位元模型而沒有進行二進位制轉換。

① 將指標或引用轉換成整型。如:float*轉成int、cbase*轉成int、float&轉成int、cbase&轉成int等

float f1 = 1.0f; cbase o1;

int n1 = reinterpret_cast(&f1);

int n2 = reinterpret_cast(&o1);

int n3 = reinterpret_cast(f1);

int n4 = reinterpret_cast(o1);

② 指標或引用之間互轉。如:float*轉成int*、cbase&轉成int&、cbase*轉成cbase2*、cbase&轉成cbase2&等

float f1 = 1.0f;  cbase1 o1;

int* n1 = reinterpret_cast(&f1);

int& n2 = reinterpret_cast(o1);

cbase2* o21 = reinterpret_cast(&o1);

cbase2& o22 = reinterpret_cast(o1);

const_cast(expression)

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

① 常量指標被轉化成非常量的指標,並且仍然指向原來的物件;

② 常量引用被轉換成非常量的引用,並且仍然指向原來的物件;

③ const_cast一般用於修改底指標。如const char *p形式。

(type)object 或 type(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

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.當在...