C++中的4种类型转换方式

C++中的4种类型转换方式
static_cast 静态的_cast
dynamic_cast 动态的_cast
reinterpret_cast 重新解释的 _cast
const_cast 常量的_cast


C++ 里最好杜绝使用 C 方式的强制转换, 换用以上 4 个.
我们通常用的是 static_cast
在一类东西都可以转, 但是不是一类的就不能转.
即, 语义上说不通的, 两个完全不同的数据类型 static_cast
是拒绝工作的.
比如你想把一个指针转成浮点数,
或者想把 class A * 转成 class B * , 但是 class A 和 class B
又没有任何关系. 等等....

static_cast 在通过编译后, 空间和时间效率实际等价于 C 方式强制转换.
都是编译时决定的.

dynamic_cast 类似 static_cast, 但是在一颗类继承树上转换时,
将利用 RTTI 在运行时检查. 我们一般用于 downcast

比如,
class A {};
class B : public A {};

A* a=new B();

这个时候, 可以用 dynamic_cast 做 downcast, 把 a 转成 B*.
和 static_cast 不同, dynamic_cast 会检查一下 a 到底是不是指向一个
B, (利用了 RTTI) 如果转不了, 将返回一个 NULL.

reinterpret_cast 就比 static_cast 更接近 C 的强制转换了.
它更进一步的, 实现一些看起来没关系的两种类型转换.
比如我习惯干的, 把一个 void * 转成 unsigned ;)
当然它比 static_cast 危险.

但是有 reinterpret_cast 干不了的,
比如你在一个 const 成员函数里企图修改一个非 mutable 的成员变量.
编译器会对你咆哮, "不许动, 那玩意是我 const 住的, 把你的爪子
收回去" 这个时候就要利用 const_cast 了, 呵呵.

const_cast 就是可以解除 const 限制的"神"的武器
但我认为, 这在很多情况下比 reinterpret_cast 更危险, 我还是老实做
人的好. 让编译器来捍卫我的代码的安全.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值