【共读Primer】32.[4.11] 类型转换-显式转换 Page144
有时我们希望对象显示的转换为另一种类型。
int i,j; double slope = i/j;
比如在上述代码中,我们希望能够执行double类型的除法。
强制类型转换
static_cast<type>(val)
不包含底层const具有明确定义的类型转换,都不可以使用该转换符
double slope= static_cast<double>(j) / i;
用于找回存在于void*中的指针类型
void* p = &d; // 任何非常亮对象的地址都能存入void* double *dp = static_cast<double*>(p); //将void*转换会初识的指针类型
上述类型转换常见于线程函数中对入参类型的转换。
dynamic_cast<type>(val)
支持类型识别的强制类型转换,被转换的源类型和目标类型必须具有继承关系
const_cast<type>(val)
去掉底层的const属性,注意这种操作只能用于非字面值常量类型。
const char *pc; char *p = const_cast<char*>(pc); // 可以转换,但是通过p写值是未定义的行为
reinterpret_cast<type>(val)
改变运算对象为模式的解释方式。强行转换中最底层的一种转换方式,同时也是最危险的一种转换方式。
旧式强制转换
type(expr); // 函数形式的强制类型转换 (type)expr; //C语言风格的强制类型转换
转换方式类似于reinterpret_cast,但是这种转换更难于追踪,所以出现问题也更难于解决。