114°

c++ 强制类型操作

强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。

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

  • 编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。
double a = 1.999;
int b = static_cast<double>(a); //编译器编译后int b = static_cast<int>(static_cast<double>(a));

把精度大的类型转换为精度小的类型,static_cast使用位截断进行处理。

  • 使用static_cast可以找回存放在void*指针中的值。
double a = 1.999;
void * vptr = & a;
double * dptr = static_cast<double*>(vptr);
cout<<*dptr<<endl;//输出1.999

static_cast仅仅是依靠类型转换语句中提供的信息来进行转换,而dynamic_cast则会遍历整个类继承体系进行类型检查,因此dynamic_cast在执行效率上比static_cast要差一些。

  • static_cast可以把任何类型的表达式转换成void类型。
  • 另外,与const_cast相比,static_cast不能把换掉变量的const属性,也包括volitale或者__unaligned属性。

dynamic_cast

是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。

dynamic_cast提供RTTI(Run-Time Type Information),也就是运行时类型识别。它对编译器有要求,需要编译器启动“运行时类型信息”这一选项。当编译器不开启RTTI时,运行含有dynamic_cast操作符的程序时会出现一个警告:

  • dynamic_cast主要用于“安全地向下转型”,dynamic_cast用于类继承层次间的指针或引用转换。

const_cast
将转换掉表达式的const性质。

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

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

 reinterpret意为“重新解释”

 

 

本文由【SibylY】发布于开源中国,原文链接:https://my.oschina.net/u/347414/blog/3013273

全部评论: 0

    我有话说: