强制类型转换,也称为显式转换,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; }