设为首页收藏本站|繁體中文 快速切换版块

 找回密码
 立即加入
搜索
查看: 824|回复: 0

C++类型转换小记

[复制链接]
  • TA的每日心情
    慵懒
    2016-4-21 12:07
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    累计签到:3 天
    连续签到:1 天
    发表于 2010-5-4 10:16:25 | 显示全部楼层 |阅读模式

    马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!

    您需要 登录 才可以下载或查看,没有账号?立即加入

    ×
    C++转换操作符ISO-C++中有四种转换操作符

    dynamic_cast: 在多态类型转换时使用,实现在运行时,并进行运行时检测,如果转换失败,返回值是NULL. U7 z' m( y: I( M
    , M2 r, C" U: `" `
    static_cast:与dynamic_cast相反,static_cast是在编译时转换类型的,故称为static_cast,它可以用在值类型转换中& O7 e% a8 X/ ?6 M! ^  ~+ ?

    ' k$ M  D# o9 J; w1 e: Uconst_cast:一般用于去除const, volatile等修饰属性上.
    1 X2 k( e' E6 T% e0 y8 T+ {2 e- I
    reinterpret_cast:这个很厉害,几乎可以在任意类型间转换,reinterpret的中文意思是重新解释

    在Visual C++ 2005及以后版本中C++/clr又添加了一个新的转换

    safe_cast:用于在托管类型间进行转换,如果不成功会抛出InvalidCastException.

    关于C风格的类型转换

         型如(type-name)value的转换是C风格的类型转换,这种转换对任意类型的都能使用。6 y, `4 m2 q1 K" a
    * L- \+ M( y% w0 C1 Y
        一般而言C风格的类型转换可以替代static_cast,const_cast,reinterpret_cast,safe_cast, 但是一般不能替代dynamic_cast。+ K0 b2 c" C% y  P9 L

    & B# F$ A" G+ E4 E9 C# `4 d    原因在于,C风格的类型转换是编译时的,对于C语言中各个不同的类型,编译成汇编代码时,这些类型信息会丢失掉,所剩下的是其长度和符号信息,而C风格的转换就是把这些长度和符号信息统一起来。 如对于两个指针间转换而言A* pa=(A*)pb,所生成的中间代码则会是 mov eax, [pb]; mov [pa],eax。
    $ l# O0 h$ k4 x9 @) e! g
    : P/ \8 T* [9 B) X* C/ H- \) r    而dynamic_cast则是会进行运行时检查,对于下行转换(从基类到子类)而言所生成的中间代码一定会调用一个函数名类似 ___RTDynamicCast的转换函数。 % I, W+ E  a' H) ^2 L; U$ h7 E" E/ [

    / S" U2 _8 i$ z% c  Astatic_cast,const_cast,reinterpret_cast所起的作用同C风格的类型转换,只是编译时对其类型约束不同而已。" |1 Q( e) z/ p& E; ?
    9 L( x8 s8 T+ N; A; m, w$ j
    safe_cast是C++/Clr中新增的关键词(Microsoft Specific),对托管类型进行C风格类型转换时, 编译器会自动使用safe_cast进行转换,这一点估计是为了和C#风格一致。

    "真诚赞赏,手留余香"
    还没有人打赏,支持一下
    楼主热帖
    帖文化:【文明发帖 和谐互动】 社区精神:【创新、交流、互助、共享】
    您需要登录后才可以回帖 登录 | 立即加入

    本版积分规则

    招聘斑竹

    小黑屋|手机版|APP下载(beta)|Archiver|电力研学网 ( 赣ICP备12000811号-1|赣公网安备36040302000210号 )|网站地图

    GMT+8, 2025-6-12 16:23

    Powered by Discuz! X3.5 Licensed

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表