c++ 強制類型操做:static_cast、dynamic_cast、const_cast、reinterpert_cast

強制類型轉換,也稱爲顯式轉換,C++中強制類型轉換操做符有static_cast、dynamic_cast、const_cast、reinterpert_cast四個。ios

static_cast<type-id>      (expression)
dynamic_cast<type-id>     (expression) 
const_cast<type-id>       (expression) 
reinterpret_cast<type-id> (expression)
//type-id爲目標數據類型,expression爲原始數據類型變量或者表達式。

//static_cast
double a = 1.999;
int b = static_cast<double>(a); 
//編譯器編譯後int b = static_cast<int>(static_cast<double>(a));
//static_cast找回存放在void*指針中的值
double a = 1.999;
void * vptr = & a;
double * dptr = static_cast<double*>(vptr);
cout<<*dptr<<endl;//輸出1.999

static_cast:編譯時執行,不提供類型檢查express

一、編譯器隱式執行的任何類型轉換均可以由static_cast顯式完成,如int與float,把精度大的類型轉換爲精度小的類型,static_cast使用位截斷進行處理安全

二、把任何類型的表達式轉換成void類型函數

dynamic_cast:dynamic_cast提供RTTI(Run-Time Type Information),也就是運行時類型識別指針或引用,會遍歷類繼承體系進行類型檢查,所以dynamic_cast在執行效率上比static_cast要差一些,它對編譯器有要求,須要編譯器啓動「運行時類型信息」這一選項。當編譯器不開啓RTTI時,運行含有dynamic_cast操做符的程序時會出現一個警告:spa

二、主要用於「安全地向下轉型」,dynamic_cast用於類繼承層次間的指針或引用轉換。指針

const_cast:將轉換掉表達式的const性質code

int main()
{
    const int constant = 26;
    const int* const_p = &constant;
    int* modifier = const_cast<int*>(const_p);
    *modifier = 3;
    cout<< "constant:  "<<constant<<endl;  //輸出26
    cout<< "const_p:  "<<*const_p<<endl;   //輸出26
    cout<<"*modifier:  "<<*modifier<<endl; //輸出3
    return 1;
}

reinterpert_cast:容許將任何指針轉換爲任何其餘指針類型。 也容許將任何整數類型轉換爲任何指針類型以及反向轉換。orm

type-id必須是一個指針、引用、算術類型、函數指針或者成員指針。謹慎使用 reinterpret_cast對象

 reinterpret意爲「從新解釋」繼承

 

#include <iostream> 
using namespace std; 
class CBasic 
{ 
public: 
     virtual int test(){return 0;} 
}; 

class CDerived : public CBasic 
{ 
public: 
     virtual int test(){ return 1;} 
}; 
  
int main() 
{ 
     CBasic        cBasic; 
     CDerived    cDerived; 
     CBasic * pB1 = new CBasic; 
     CBasic * pB2 = new CDerived;
     CBasic * pB3 = new CBasic;
     CBasic * pB4 = new CDerived;
     
     
     //dynamic cast failed, so pD1 is null. 
     CDerived * pD1 = dynamic_cast<CDerived * > (pB1);    
                  
     //dynamic cast succeeded, so pD2 points to  CDerived object                                         
     CDerived * pD2 = dynamic_cast<CDerived * > (pB2);
     //pD3將是一個指向該CBasic類型對象的指針,對它進行CDerive類型的操做將是不安全的
     CDerived * pD3 = static_cast<CDerived * > (pB3);     
     //static_cast成功
     CDerived * pD4 = static_cast<CDerived * > (pB4);      
      
     //dynamci cast failed, so throw an exception.             
//    CDerived & rD1 = dynamic_cast<CDerived &> (*pB1);    
  
//dynamic cast succeeded, so rD2 references to CDerived object. 
     CDerived & rD2 = dynamic_cast<CDerived &> (*pB2);    
  
     return 0; 
}
相關文章
相關標籤/搜索