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; 
}
相关文章
相关标签/搜索