1. 程式人生 > >C++中4個與型別轉換相關的關鍵字

C++中4個與型別轉換相關的關鍵字

static_cast

const_cast

dynamic_cast

reinterpret_cast

一.型別轉換

    表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。在C++中,某些型別之間存在相關的依賴關係。若兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或值。如果兩個型別之間可以相互轉換,則稱這兩個型別相關。

    “轉換”是一種編譯器指令,大部分情況下他不改變一個指標所含的真正地址,他隻影響“被指出之記憶體大小和其內容”的解釋方式。

二.四種與型別轉換相關的關鍵字

1.static_cast--運算子完成相關型別之間的轉換

在同一類層次結構中的一個指標型別到另一個指標型別,整形到列舉,浮點型到整形等。

例:

int m=0;
double n=static_cast<int>m;

int *p=static_cast<int*>(malloc(100));

2.const_cast--移除變數的const或volatile限定符

//volatile:指令關鍵字,確保本條指令不會因為編譯器的優化而省略,且要求每次直接讀值

3.dynamic_cast--處理基類到派生類的轉換(基類必須有虛擬函式,為多型時可以轉換)

它是執行時進行型別檢測的型別轉換,如果繫結到引用或指標的物件不是目標型別的物件,則dynamic——cast建立失敗。

將基類的指標或引用安全地轉換為派生類的指標或引用。當虛擬函式不能使用的時候,再使用dynamic_cast關鍵字,從基類指標獲得派生類行為。

class Base

{

public:

   virtual int test(){return 0;} //基類中存在虛擬函式,故在派生類中存在虛擬函式指標指向虛擬函式表。

};

class Derived:public Base

{

public:

   virtual int test(){return 1;}

};

int main()

{

Base cbase;

Derived cderived;

Base *p1=new Base;

Base *p2=new Derived;

Derived* pD1=dynamic_cast<Derived*>(p1);//p1沒有真正指向派生類,pD1置為0

Derived* pD2=dynamic_cast<Derived*>(p2); //正確

//Derived& pd1=dynamic_cast<Derived&>(*p1);//p1沒有真正指向派生類,pd1丟擲異常

Derived& pd2=dynamic_cast<Derived&>(*p2);//正確

return 0;

}

4.reinterpret_cast--處理互不相關型別之間的轉換

它可以轉換任何內建的資料型別為其他任何的資料型別,也可以轉換任何指標型別為其他的型別。他甚至可以轉換內建的資料型別為指標,無需考慮型別安全或者常量的情形,不到萬不得已不使用它。

int a=10;
double *b=reinterpret_cast<double*>(a)//b的轉換結果為0x0000000a