• static_cast reinterprt_cast 区别


     

    为什么设计 static_cast……………..替代。

    reinterprt_cast那么多缺点,哪儿可以用。。。这里有解释。

     

     

    整理于 csdn帖子。。

     

    有 reinterprt_cast 存在的必要, 必有一个对象是指针。

     

     

     

     

    从定义上 从应用上

    重新认识

     

    static_cast 无所谓指针,

    替代c语言 传统转换

    编译时检查

    指针或者 引用,

    只处理down-casting

    reinterpret_cast 必须有指针

    编译时不检查


     

     

     

     

    问题:

    是不是任何可以使用reinterpret_cast的地方都可以使用static_cast 呢?A: 答案否

    reinpreter_cast

    定义

    type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

     

     

    2、C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。

     

    所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如: 

     

    int i; 

    char *p = "This is a example."; 

    i = reinterpret_cast<int>(p); 

     

    此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,一个明显的现象是在转换前后没有数位损失。

     

     

     

       66学习 最大收获:  reinpreter_cast  必须有一个成员是 指针!!转换的对象

       

      不懂? 看过 reinpreter_cast  数据损失有没有啊???---A:没有进行而精致的转换。

       

       

    static_cast定义

    static_cast

     

     

    该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

     

    用于类层次结构中基类和子类之间 指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;

     

    进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

     

    用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

     

    把空指针转换成目标类型的空指针。

     

    把任何类型的表达式转换成void类型。

     

    注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

     

     

    66学习: reinpreter_cast 专注于指针。

                       static_cast 可以不仅仅是指针。(不包括 down casting...基类变为子类指针)。。还有 基本数据类型之间,基本 式子与void…

    所以在此下结: static_cast 不包含 reinpreter_cast 的功能。。(尤其down casting

     

    Why design

    static_cast

    、C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作

     

      66学习:如果没有类,那么static_cast够了

    那么能够处理下面的情形嘛?

    typedef void (*pfv) ();
    pfv= interpret_cast < pfv > &Func();
    typedef
    void (*pfd) ( double &);
    pfd= interpret_cast < pfd > pfv;

     

    改变指针的意义,由无参数入口变成有一个双精度引用参数入口

     

    用于无关的转换,如把长整型变成地址,显卡地址:

    long video_card = 0x0c00000;

    typedef void (* CardFunc ) ();

    CardFunc = reinterpret < void (*)() > video_card;

     

     

    网友的说法1

     

    fetag

    reinterpret_cast是一种很“粗暴”的强转,相当于直接获得对象的首地址,然后赋给一个指针,对象内部成员

     

    的偏移、对齐等一概不管,所以移植性基本等于零

     

    而static_cast是一种比较“温和”的强转。一个典型的例子

     

    是,reinterpret_cast可以将两个毫无关系的对象,进行互相强转,而static_cast则要两个对象之间多少有点关系(66:这个关系:详细看看 我的另一个帖子。。待更新)

    才行…

     

    详细的解释,在这本书里面有:<ANSI-ISO C++ Professional Programmer's Handbook>,这本书只有电子版,

     

    没有纸版的,且只有英文版…

    Static_cast是有损的

     

     

    static 是有转换变换,用于基本量的变换,如float 到 long 都是32位的,但是格式不同:

    C/C++ code

     

    float A = 1.234567;   IEEE float位码表示为:1+ 7 + 1 +23 的32位格式

     

    long  B = static_cast < long > B;  ;IEEE long位码表示为 1+ 31位 的32位格式

     

     

     

    将后float 24位扩展到long 32位并进行指数调整(乘积),丢掉多余的精度部分,因此是有损修改变换。

     

     

    reinterpret_cast

     

    存在的应用意义

     

     

     

    reinterpret是无转换变换,是无损的,如指针变换,仍然是地址,特别是用于函数指针

    C/C++ code

     

    typedef void (*pfv) ();
    pfv= interpret_cast < pfv > &Func();
    typedef
    void (*pfd) ( double &);
    pfd= interpret_cast < pfd > pfv;

     

    改变指针的意义,由无参数入口变成有一个双精度引用参数入口

     

    用于无关的转换,如把长整型变成地址,显卡地址:

    long video_card = 0x0c00000;

    typedef void (* CardFunc ) ();

    CardFunc = reinterpret < void (*)() > video_card;

     

     

      66小结:最大收获 从网友(Frisky_Lobo)的意见看来,

       reinterpret _cast主要用于函数指针。。 对于 类指针不是行家

  • 相关阅读:
    2015 多校联赛 ——HDU5389(dp)
    spring MVC配置详解
    面试题整理11
    面试题整理09
    Spring和SpringMVC的区别
    SpringMVC01
    js中typeof与instanceof用法小记
    Java 可变参数
    log4j文件的配置
    Hibernate 分组查询 子查询 原生SQL
  • 原文地址:https://www.cnblogs.com/titer1/p/2412016.html
Copyright © 2020-2023  润新知