強制類型轉換,也稱爲顯式轉換,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; }