C++中static_cast和reinterpret_cast的区别
来源:互联网 发布:sql服务器拒绝访问 编辑:程序博客网 时间:2024/05/17 02:08
1-static_cast-- ----C++primer第五章里写了编译器隐式执行任何类型转换都可由static_cast显示完成;主要用法如下:
①用于类层次结构中基类和子类之间指针或引用的转换。
进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
2-reinterpret_cast—用来处理无关类型之间的转换;
它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。
【reinterpret_cast的字面意思:重新解释(类型的比特位)】
也就是说reinterpret_cast将数据以二进制存在形式的重新解释。但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。
主要用法如下:
· 从指针类型到一个足够大的整数类型
· 从整数类型或者枚举类型到指针类型
· 从一个指向函数的指针到另一个不同类型的指向函数的指针
· 从一个指向对象的指针到另一个不同类型的指向对象的指针
· 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
· 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
归纳为:reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。
比如:
int i;
char *p = "This is a example.";
i = reinterpret_cast<int>(p);
此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,一个明显的现象是在转换前后没有数位损失。
例如:int *n= new int ;
double *d=reinterpret_cast<double*> (n);
在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast仅仅是复制 n的比特位到 d, 没有进行必要的分析。
因此, 需要谨慎使用 reinterpret_cast.
并且:reinterpret_cast只能在指针之间转换。
总结
1-static_cast 和 reinterpret_cast操作符修改了操作数类型。
2-它们不是互逆的;
3-static_cast 在编译时使用类型信息执行转换,在转换执行必要的检测(诸如指针越界计算,类型检查).其操作数相对是安全的。
reinterpret_cast 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,需要谨慎使用。
MSDN的Visual C++指出:错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。
例子如下:
int n=9; double d=static_cast < double > (n);
上面的例子中, 我们将一个变量从 int 转换到 double。这些类型的二进制表达式是不同的。要将整数 9转换到双精度整数 9,static_cast需要正确地为双精度整数 d补足比特位。其结果为 9.0。
而reinterpret_cast的行为却不同:
int n=9;
double d=reinterpret_cast<double & > (n);
这次, 结果有所不同.在进行计算以后, d包含无用值.这是因为 reinterpret_cast仅仅是复制 n的比特位到 d,没有进行必要的分析.
遗忘点:
const int * p=&value;
int *
const q =&value;
- C++中static_cast和reinterpret_cast的区别
- C++中static_cast和reinterpret_cast的区别
- C++中static_cast和reinterpret_cast的区别
- static_cast 和 reinterpret_cast的区别
- static_cast 和 reinterpret_cast的区别
- static_cast和reinterpret_cast的区别
- static_cast和reinterpret_cast的区别
- C++中static_cast和reinterpret_cast的区别(转)
- Qt 中C++ static_cast 和 reinterpret_cast的区别
- C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用
- static_cast 和 reinterpret_cast的区别以及dynamic_cast
- static_cast、dynamic_cast、const_cast和reinterpret_cast的区别
- dynamic_cast、static_cast、const_cast和reinterpret_cast的区别
- [C/C++]_[初级]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和区别]
- reinterpret_cast与static_cast的区别
- reinterpret_cast与static_cast的区别
- C++中static_cast和reinterpret_cast
- static_cast,dynamic_cast,reinterpret_cast const_cast于c语言cast的区别
- Apache Ant入门
- 贺利坚-如何阅读代码(已阅加重点划)
- java对称加密
- 移动开发策略的选择
- android驱动到硬件抽象层
- C++中static_cast和reinterpret_cast的区别
- Android带输入框的dialog
- 能使 Oracle 索引失效的七大限制条件
- 博客被盗发广告,被关闭~
- 2.14
- JS统制HTML页面控件的属性
- 关于SpringMVC ajax controller 找不到请求的错误
- 引导区电脑病毒
- java 给图片上水印