C 型別轉換運算子

2021-07-14 06:19:58 字數 3253 閱讀 7006

隱式轉換,是針對不同型別之間的賦值和運算,函式呼叫傳遞引數 這些的轉換都是由編譯器自動完成

char ch; 

int i=ch;

顯式轉換 由程式設計師在變數前面新增型轉換

char *pc=(char *)pb void *ps=(void*)pa
*通過上述的兩種方式,c語言大部分的型別轉換都可以順利進行,c++繼承了c中的隱式和顯式轉換的方式,由於c++本身物件模型的複雜性,c++增加了4種型別轉換運算子

在了解c++四種型別轉換之前,一些概念先了解一下一些基本概念

rtti 是執行階段型別識別

c++ 有3個支援rtti的元素

test_enum type = test_enum_1;

char a ;

int b = static_cast

(a);

char c = static_cast

(b);

type = static_cast

(b);

char*pa = null;

int *pb = (int*)pa;

//int *pb = static_cast pa); //error

//pa = static_castpb) //error

char *pc = (char*)pb;

//char *pc = static_cast(pb); //error

void *p = static_cast

(pa);

pb = static_cast

(p);

pc = static_cast

(p);

上行轉換:子類指標或引用轉換成基類表示——安全

下行轉換:基類指標或引用轉換成子類表示——危險(沒有動態型別檢查)

class a

;class b:public a

;class c:public a

;class d

;a obja;

b objb;

a*pobja = new a();

b*pobjb = new b();

c*pobjc = new c();

d*pobjd = new d();

obja = static_cast

(objb); //轉換為基類引用

obja = static_cast

(objb);

objb = static_cast(obja); //不能進行轉換

pobja = pobjb; //right 基類指標指向子類物件

//objb = obja; //error 子類指標指向基類物件

pobja = static_cast

(pobjb); //right 基類指標指向子類

pobjb = static_cast

(pobja); //可以強制轉換基類到子類

//pobjc = static_cast(pobjb); //error 繼承於統一類的派生指標之間轉換

//pobjd = static_cast(pobjc); //error 兩個無關聯之間轉換

(1)繼承關係的類指標物件或引用之間轉換

class a

;class b:public a

;class c:public a

;class d

;a obja;

b objb;

a*pobja = new a();

b*pobjb = new b();

c*pobjc = new c();

d*pobjd = new d();

//obja = dynamic_cast(objb); //error 非引用

obja = dynamic_cast

(objb);

//objb = dynamic_cast(obja); //error a 不是多型型別不能轉換 若有虛函式則可以進行轉換

pobja = dynamic_cast

(pobjb);

//pobjb = dynamic_cast(pobja); //error a 繼承關係 不是多型型別不能轉換

//pobjb = dynamic_cast(pobjc); //error c 兄弟關係 不是多型型別不能轉換

//pobjb = dynamic_cast(pobjd); //error d 沒有關係 不是多型型別不能轉換

包含有虛函式之間物件指標的轉換
class a

};class b:public a

;class c:public a

;class d

};pobjb = dynamic_cast

(pobja); // worning 繼承關係 父類具有虛函式 多型

pobjb = dynamic_cast

(pobjd); //worning 沒有關係 d是多型型別可以轉換

//以上結果:pobjb == null 此處會發生乙個執行時錯誤

> const_cast (expression) 中的type_name和expression的型別必須是一樣的

```cpp

high bar

const high *pbar=&bar

....

high *pb=const_cast

型別

用途dynamic_cast

通常在基類和派生類之間轉換時使用

static_cast

一般的轉換,如果你不知道該用哪個,就用這

const_cast

主要針對const和volatile的轉換

reinterpret_cast

用於進行沒有任何關聯之間的轉換,比如乙個字元指標轉換為乙個整形數

c 型別轉換運算子

c 中有4個型別轉換運算子,使裝換過程更規範 dynamic cast type name expression 如果轉型失敗則返回0,即空指標。該運算子的用途是,使得能夠在類層次結構中進行向上轉換 由於 is a關係,這樣的型別轉換時安全的 而不允許其他轉換。二 const cast const ...

C 型別轉換運算子

用於 指向派生類物件的 基類指標轉換成派生類指標。如果轉換失敗,則返回0,即空指標。通過判斷轉換是否成功,來決定是否用派生類裡的函式 基類中可能沒有那個函式 class a class b public a class c public b a a new a a b new b a c new c...

C 型別轉換運算子

目錄 dynamic cast static cast const cast reinterpret cast c語言的型別轉換比較自由,但也帶來了一些問題,這些問題大多由程式設計師自行控制和解決。對於龐大的c 語言機制而言,這種簡單粗暴的型別轉換方式顯然是個巨大的負擔,因此c 引入4種型別轉換運算...