C++的類型轉換函數


C++的類型轉換函數

reinterpret_castconst_caststatic_castdynamic_cast 前三個類型轉換是在編譯時實現轉換,dynamic_cast是在運行時進行類型轉換的。

reinterpret_cast<new type>expression

const_cast<  new type>( expression)

static_cast<new type>(expression)

dynamic_cast<newtype>(expression)

 

1reinterpret_cast

reinterpret_cast將一個類型的指針轉換為另一個類型的指針,它也允許從一個指針轉換為整數類型。這種轉換不用修改指針變量值數據存放格式(不改變指針變量),而是在編譯時重新解釋指針的類型(操作結果只是簡單的從一個指針到別的指針的值的二進制拷貝。在類型之間指向的內容不做任何類型的檢查和轉換)不能用於非指針類型的轉換

1)轉換一個指針為其它類型的指針,能夠在非相關的類型之間轉換

class A {};

class B {};

A * a = new A;

B * b = reinterpret_cast<B *>(a);

2)不能將const指針轉換為非const        

         const int* point =&j;

        dm  =reinterpret_cast<double*>(point);

 3)不能用於非指針類型的轉換

         int i; double j = 2.1

         j =reinterpret_cast<int>(j);

 4可以將一段buffer轉成一個類的對象指針,或者反過來。

class A;

A a;

char* pBuffer = reinterpret_cast<char*> (&a);

 

  

2const_cast

const_cast用於const指針與普通指針間的相互轉換(將一個const指針轉換為對應指針類型的普通指針變量,也可以將一個普通指針變量轉換為一個const指針)。不能將非常量指針變量轉換為普通變量const轉為非const,或者volatile轉為非volatile)。

 

 

class C {};

const C *a = new C;

C *b = const_cast<C *>(a);

 

3static_cast

static_cast主要用於基本類型間的相互轉換,和具有繼承關系間的類型轉換(將子類類型的指針轉換為父類類型的指針,也能夠轉換父類類型的指針為它的子類類型的指針)。

   1)用於替代C風格的顯式轉換和各種類型指針到void*的轉換

                    long b = (int) a;

           long b =static_cast<int>(a);

        2)用於父類到子類指針的轉換

        3)不能在類層次外轉換,所以static_cast比C方式轉換安全。

        float x;

      Count<<static_cast<int>(x);//x作為整型值輸出

 

4dynamic_cast

dynamic_cast只能在繼承類對象的指針之間或引用的相互轉換,在運行時動態轉換。只用於對象的指針和引用。當用於多態類型時,它允許任意的隱式類型轉換以及相反過程會檢查操作是否有效。指針間轉換失敗可以通過判斷是否為null來判斷,引用轉換失敗則拋出 bad_cast 異常。

  1只有類中含有虛函數才能用dynamic_cast,因其是依賴於VTable來工作的。

      2用於多態類型的轉換,比如從父類到子類的轉換。

      3當明確知道子類的類型時,可用static_cast轉換,其效率高點。

   

         class Car;

         classCabriolet:public Car{};

         classLimousline:public Car{};

         voidf(Car *cp)

         {

              Cabriolet*p = dynamic_cast< Cabriolet > cp;

         }


免責聲明!

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



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