staticcast和reinterpretcast分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
static_cast和 reinterpret_cast reinterpret_cast 可以转换任意一个 32bit 整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,威力最为强大! 但不能将非 32bit 的实例转成指针。总之,只要是32bit 的东东,怎么转都行! static_cast 和 dynamic_cast 可以执行指针到指针的转换,或实例本身到实例本身的转换,但不能在实例和指针之间转换。static_cast 只能提供编译时的类型安全,而 dynamic_cast 可以提供运行时类型安全。举个例子: class a;class b:a;class c。 上面三个类a 是基类,b 继承 a,c 和 ab 没有关系。有一个函数 void function(aa); 现在有一个对象是b 的实例b,一个c 的实例c。 function(static_casta(b)可以通过而 function(statica(c))不能通过编译,因为在编译的时候编译器已经知道c 和 a 的类型不符,因此 static_cast 可以保证安全。 下面我们骗一下编译器,先把c 转成类型a bref_b = reinterpret_castbc; 然后 function(static_casta(ref_b))就通过了!因为从编译器的角度来看,在编译时并不能知道 ref_b 实际上是c! 而 function(dynamic_casta(ref_b))编译时也能过,但在运行时就失败了,因为 dynamic_cast 在运行时检查了 ref_b 的实际类型,这样怎么也骗不过去了。 在应用多态编程时,当我们无法确定传过来的对象的实际类型时使用dynamic_cast,如果能保证对象的实际类型,用 static_cast 就可以了。至于 reinterpret_cast,我很喜欢,很象 c 语言那样的暴力转换:) dynamic_cast:动态类型转换static_cast:静态类型转换reinterpret_cast:重新解释类型转换const_cast:常量类型转换 专业的上面很多了,我说说我自己的理解吧: synamic_cast 一般用在父类和子类指针或应用的互相转化; static_cast 一般是普通数据类型(如 int m=static_castint(3.14)); reinterpret_cast 很像c 的一般类型转换操作 const_cast 是把 cosnt 或 volatile 属性去掉 . 介绍 大多程序员在学 C++前都学过 C,并且习惯于 C 风格(类型)转换。当写 C++(程序)时, 有时候我们在使用 static_cast和 reinterpret_cast时可能会有点模糊。在本文中,我将说明 static_cast实际上做了什么,并且指出一些将会导致错误的情况。 泛型(Generic Types) float f = 12.3; float* pf = f; // static cast // 成功编译, n = 12 int n = static_castint(f); // 错误,指向的类型是无关的(译注:即指针变量 pf 是 float 类型,现在要被转换为 int 类型) //int* pn = static_castint*(pf); //成功编译 void* pv = static_castvoid*(pf); //成功编译, 但是 *pn2 是无意义的内存(rubbish) int* pn2 = static_castint*(pv); // reinterpret_cast //错误,编译器知道你应该调用 static_cast //inti = reinterpret_castint(f); //成功编译, 但是 *pn 实际上是无意义的内存,和 *pn2 一样 int* pi = reinterpret_castint*(pf);简而言之,static_cast将尝试转换,举例来说,如 float- 到-integer,而 reinterpret_cast简单改变编译器的意图重新考虑那个对象作为另一类型。指针类型(Pointer Types) 指针转换有点复杂,我们将在本文的剩余部分使用下面的类: classCBaseX { public: int x; CBaseX() { x = 10; } void foo() { printf(CBaseX::foo() x=%d/n, x); } }; classCBaseY { public: int y; int* py; CBaseY() { y = 20; py = y

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档