c++标准转换运算符reinterpret_cast

c++标准转换运算符reinterpret_cast

ID:16215178

大小:45.00 KB

页数:4页

时间:2018-08-08

c++标准转换运算符reinterpret_cast_第1页
c++标准转换运算符reinterpret_cast_第2页
c++标准转换运算符reinterpret_cast_第3页
c++标准转换运算符reinterpret_cast_第4页
资源描述:

《c++标准转换运算符reinterpret_cast》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C++标准转换运算符reinterpret_castreinterpret_cast(expression)reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解释(类型的比特位)。我们真的可以随意将一个类型值的比特位交给另一个类型作为它的值吗?其

2、实不然。IBM的C++指南里倒是明确告诉了我们reinterpret_cast可以,或者说应该在什么地方用来作为转换运算符:·从指针类型到一个足够大的整数类型·从整数类型或者枚举类型到指针类型·从一个指向函数的指针到另一个不同类型的指向函数的指针·从一个指向对象的指针到另一个不同类型的指向对象的指针·从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针·从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针不过我在Xcode中测试了一下,事实上reinterpret_cast的使用并不局限在上边所说的几项的,

3、任何类型的指针之间都可以互相转换,都不会得到编译错误。上述列出的几项,可能是Linux下reinterpret_cast使用的限制,也可能是IBM推荐我们使用reinterpret_cast的方式所以总结来说:reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。(所谓"足够大的整数类型",取决于操作系统的参数,如果是32位的操作系统,就需要整形(int)以上的;如果是64位的操作系统,则至少需要长整形(long)。具体大小可

4、以通过sizeof运算符来查看)。reinterpret_cast有何作用从上边对reinterpret_cast介绍,可以感觉出reinterpret_cast是个很强大的运算符,因为它可以无视种族隔离,随便搞。但就像生物的准则,不符合自然规律的随意杂交只会得到不能长久生存的物种。随意在不同类型之间使用reinterpret_cast,也之后造成程序的破坏和不能使用。比如下边的代码typedefint(*FunctionPointer)(int);intvalue=21;FunctionPointerfuncP;funcP=

5、reinterpret_cast(&value);funcP(value);我先用typedef定义了一个指向函数的指针类型,所指向的函数接受一个int类型作为参数。然后我用reinterpret_cast将一个整型的地址转换成该函数类型并赋值给了相应的变量。最后,我还用该整形变量作为参数交给了指向函数的指针变量。这个过程编译器都成功的编译通过,不过一旦运行我们就会得到"EXC_BAD_ACCESS"的运行错误,因为我们通过funcP所指的地址找到的并不是函数入口。由此可知,reinterpr

6、et_cast虽然看似强大,作用却没有那么广。IBM的C++指南、C++之父BjarneStroustrup的FAQ网页和MSDN的VisualC++也都指出:错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。这样说起来,reinterpret_cast转换成其它类型的目的只是临时的隐藏自己的什么(做个卧底?),要真想使用那个值,还是需要让其露出真面目才行。那到底它在C++中有其何存在的价值呢?MSDN的VisualC

7、++DeveloperCenter给出了它的使用价值:用来辅助哈希函数。下边是MSNDN上的例子://expre_reinterpret_cast_Operator.cpp//compilewith:/EHsc#include//ReturnsahashcodebasedonanaddressunsignedshortHash(void*p){unsignedintval=reinterpret_cast(p);return(unsignedshort)(val^(val>>16)

8、);}usingnamespacestd;intmain(){inta[20];for(inti=0;i<20;i++)cout<

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。