为什么设计 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) ();
改变指针的意义,由无参数入口变成有一个双精度引用参数入口
用于无关的转换,如把长整型变成地址,显卡地址: long video_card = 0x0c00000; typedef void (* CardFunc ) (); CardFunc = reinterpret < void (*)() > video_card;
|
网友的说法1 |
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) ();
改变指针的意义,由无参数入口变成有一个双精度引用参数入口
用于无关的转换,如把长整型变成地址,显卡地址: long video_card = 0x0c00000; typedef void (* CardFunc ) (); CardFunc = reinterpret < void (*)() > video_card;
|
| 66小结:最大收获 从网友(Frisky_Lobo)的意见看来, reinterpret _cast主要用于函数指针。。 对于 类指针不是行家 |