【共读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,但是这种转换更难于追踪,所以出现问题也更难于解决。

 

posted @ 2018-08-27 09:54  chattyku  阅读(108)  评论(0)    收藏  举报