C++风格的强制类型转换之小结

1、static_cast<type>(expression)

      与C风格的强制类型转换除了语法的区别外,不同的地方在于static_cast不能在指针类型与非指针类型之间进行转换,也不能消除类型中的const和volatile属性。最重要的是,它能在编译时刻就验证被转换的变量与目标类型之间是否相容。如果类型转换不合理,就会导致编译时刻错误。由于它使用起来更加安全并且不进行运行时刻的检查,因此更偏向于使用这种强制类型转换。但是不推荐用于向下强制类型转换(即把基类指针或引用转换成派生类表示)。

2、dynamic_cast<type>(expression)

      在运行时刻对强制类型进行转换。type必须是类的指针、类的引用或者void*。如果type是指针,那么expression也必须是指针,引用也一样。当指针无效时,返回0,若是无效的引用强制类型转换,就发生bad_cast异常。建议使用这种强制类型转换来进行向下的强制类型转换,比static_cast安全。dynamic_cast允许交叉转换(即B、C类都继承A类,可以将指向B类的指针转换成指向C类的指针,结果是空指针)。

      注意:type所指的类的父类必须有虚函数,因为运行时类型检查需要运行时类信息,而这个信息存储在类的虚函数表。

3、const_cast<type>(expression)

      用来消除类型中的const和volatile属性。

4、reinterpret_cast<type>(expression)

      能转换不相容的数据类型,特别是在指针类型和非指针类型之间进行转换。比如在把一个指针传递给多态LPARAM参数进行的转换。

      注意:reinterpret_cast修改了类型,但仅仅是重新解释了给出对象的比特模型而没有进行二进制转换。


参考书籍:《Debugging Windows Programs》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值