reinterpret_cast与static_cast的区别

C++通过指针来访问成员的过程,实际上是根据指针的类型,找到改类定义,并从中找到要访问的成员的地址偏移,然后从对象指针开始加上偏移,便得到了成员的地址,然后进行访问操作。
所以类定义的作用之一在于,确定成员的内存偏移。

static_cast会在编译期将指针在类的内存空间内移动,并最终指向到你转换到的内存上。在上面的例子中,当将CDerived*的指针转型为Y*型指针时,实际上将指针的数值修改了,指向了内存中Y类的开头位置。当使用转换后的指针访问Y的成员时,先到Y类定义查到Y的内存分布,然后进行指针便宜,访问。一切都是正确的。

reinterpret_cast并不会在转型是修改指针的值,而是告诉编译期,这个指针是某个类型的指针,仅此而已。所以当使用此转型方式转换CDerived*的指针到Y*类型时,指针仍然指向原来的位置,即CDerived*的开头,也是A*的开头。这时如果访问Y*的成员y,那么先到Y上查到y的地址偏移为一个整型的字节大小(一般是4),那么你实际是将指针偏移到了X类的x成员处,访问的是x的内容。这种错误是编译器不明白的,你的程序即将崩溃。

所以,请谨慎使用reinterpret_cast。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值