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不能转换掉expressionconstvolitale、或者__unaligned属性。

2-reinterpret_cast—用来处理无关类型之间的转换;

它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。

reinterpret_cast的字面意思:重新解释(类型的比特位)

也就是说reinterpret_cast将数据以二进制存在形式的重新解释。但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。

主要用法如下:

·        从指针类型到一个足够大的整数类型

·        从整数类型或者枚举类型到指针类型

·        从一个指向函数的指针到另一个不同类型的指向函数的指针

·        从一个指向对象的指针到另一个不同类型的指向对象的指针

·        从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针

·        从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针

归纳为:reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。

比如:

int i;

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

i = reinterpret_cast<int>(p);

此时结果,ip的值是完全相同的。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 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,需要谨慎使用。

MSDNVisual C++指出:错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。

例子如下:

int n=9; double d=static_cast < double > (n);

上面的例子中, 我们将一个变量从 int 转换到 double这些类型的二进制表达式是不同的。要将整数 9转换到双精度整数 9static_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;

这两个语句的含义是不同的,前者是"所指内容不可变",后者则是"指向的地址不可变"
0 0
原创粉丝点击