c++中4個與類型轉換相關的關鍵字分析


static_cast  

reinterpret_cast

dynamic_cast

const_cast

1.**static_cast------運算符完成相關類型之間的轉換**

使用場景:如在同一類層次結構中的一個指針類型到另一個指針類型,整型到枚舉類型,或者浮點型到整型等。

例:  1,  int m=10;

     double n=static_cast < int > m;

    2, int * q=static_cast < int* >(malloc(100));

2.**reinterpret_cast------處理互不相關類型之間的轉換**

使用場景:如從整型到指針,一種類型的指針到另一種類型的指針等

例: int a=10;

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

3.**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,const_cast用來移除變量的const或volatile限定符。

一句話:強制去掉const(或volatile)  必須使用const_cast 。

注:
volatile的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.
簡單地說就是防止編譯器對代碼進行優化.比如如下代碼:
a=1;
a=2;
a=3;
a=4;
對外部硬件而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是編譯器卻會對上述四條語句進行優化,認為只有a=4(即忽略前三條語句,只產生一條機器代碼)。如果鍵入volatile,則編譯器會逐一的進行編譯並產生相應的機器代碼(產生四條代碼).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM