【C++】强制转换关键字const_cast/static_cast/dynamic_cast/reinterpret_cast的区别

C++继承了C中的隐式和显式转换的方式。但这种转换并不是安全和严格的,

加上C++本身对象模型的复杂性,C++增加了四个显示转换的关键字。(C++是强类型语言)

经过编码测试,小结如下:

①const_cast:仅用于去掉完全同类型的const,volatile约束,不能含有任何其它类型的转换,若不含约束也可以相当于没转换。
②static_cast:使用类型可在继承的方向上向上或向下转换,不进行安全检查。
      子类转父类,值、引用、指针形式均可,其中指针还可以是常量。
      父类转子类,值不可以,引用和指针均可,子类中的多余成员值是乱码。
      不支持不同无关类之间的转换。
③dynamic_cast:动态转换,使用类型可在继承的方向上向上或向下转换,进行安全检查。
      子类转父类,值不可以,引用、指针均可,其中指针还可以是常量。
      父类转子类,值不可以,引用可通过编译,但运行失败。指针可通过编译,该转换也能运行,但是后面再调用方法时会检查类型,判断是否失败。
      不同无关类之间的转换均不能运行,但多态类可通过编译。
④reinterpret_cast:强制类型转换,不改变原有数据,只是重新解释内存。
      子类转父类,值不可以,引用、指针形式均可,其中指针还可以是常量。
      父类转子类,值不可以,引用和指针均可,子类中的多余成员值是乱码。
      不同无关类之间的转换,值不可以,引用和指针均可,重新解释内存。

注意对能成功进行的含virtual方法的类,通过引用转换和指针转换后对virtual方法的调用不同:

      假设转换前为pref_class转换后为post_class,则通过引用转化调virtual方法实际是调用post_class中对应方法的;通过指针转换调post_class中virtual指针相对存放位置对应pref_class相对位置的指针对应的方法(若该位置指向不是方法,运行失败),形参不一致会自动补全(一般是乱码)或删减。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值