强制类型转换,也称为显式转换,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意为“重新解释”