C++11_4种类型转换

​C++的四种强制类型转换为:static_cast、const_cast、reinterpret_cast和dynamic_cast
类型转换的一般形式:cast-name(expression);

static_cast

静态转换(完全依赖编译期信息,可以认为是编译时评估的),也就是在编译期间转换,转换失败的话会抛出一个编译错误。没有运行时类型检查。

一般来说,编译器可以隐式转换的,都可以用static_cast进行显式转换。

  • 类层次结构中的基类和子类之间指针或引用的转换:
    进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
    进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的(得用dynamic_cast)。
  • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
  • void指针和目标类型指针间的互相转换,例如void *转int *、char *转void *等。

注意事项:

  • 大精度转换为小精度的会造成截断处理,损失精度;
  • 由于没有动态类型检查,所以多态的向下转换是不安全的。
  • 不能用于两个具体类型指针之间的转换,例如int *转double *、Student *转int *等。
    不同类型的数据存储格式不一样,长度也不一样,用 A 类型的指针指向 B 类型的数据后,会按照 A 类型的方式来处理数据:如果是读取操作,可能会得到一堆没有意义的值;如果是写入操作,可能会使 B 类型的数据遭到破坏,当再次以 B 类型的方式读取数据时会得到一堆没有意义的值。
  • 不能用于int 和指针之间的转换。将一个具体的地址赋值给指针变量是非常危险的,因为该地址上的内存可能没有分配,也可能没有读写权限,恰好是可用内存反而是小概率事件。

const_cast

它用来去掉表达式的 const 修饰或 volatile 修饰。换句话说,const_cast 就是用来将 const/volatile 类型转换为非 const/volatile 类型。

dynamic_cast

动态转换,会在程序运行期间借助 RTTI 进行类型检查,达到安全转换,这就要求基类必须包含虚函数。一般用于多态中的向下转换。

  • 对于指针,如果转换失败将返回 nullptr;
  • 对于引用,如果转换失败将抛出std::bad_cast异常。
  • 只能转换为指向完整类类型的指针,完整类类型的引用,或指向(可为 cv 限定的)void 的指针

reinterpret_cast

reinterpret 是“重新解释”的意思,顾名思义,reinterpret_cast 这种转换仅仅是对二进制位的重新解释(可以理解为无关类型底层的内存强制转换),不会借助已有的转换规则对数据进行调整,非常简单粗暴,所以风险很高。

reinterpret_cast 可以认为是 static_cast 的一种补充,一些 static_cast 不能完成的转换,就可以用 reinterpret_cast 来完成,例如两个具体类型指针之间的转换、int 和指针之间的转换(有些编译器只允许 int 转指针,不允许反过来)。

总结

  • 去掉const/volatile属性用const_cast
  • 多态中的向下转换用dynamic_cast
  • 除去上两种的转换,其他转换都可以用static_cast
  • 针对static_cast无法转换(编译报错的)则可以使用reinterpret_cast强制底层二进制位的转换(不安全,慎用)。

参考

C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast
【C++专题】static_cast, dynamic_cast, const_cast探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值