- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
标准C 类型转换符 vs C风格的强制类型转换
标准C 类型转换符 vs C风格的强制类型转换 标准C++类型转换符vs C风格的强制类型转换2010-05-11 16:35标准C++类型转换符 C风格(C-style)强制转型如下:(T)expression//cast expression to be of type T 函数风格(Function-style)强制转型使用这样的语法:T(expression)//cast expression to be of type T 这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我把这两种形式称为旧风格(old-style)的强制转型。 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 3.1 static_cast用法:static_cast type-id(expression)该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。③把空指针转换成目标类型的空指针。④把任何类型的表达式转换成void类型。 注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。 3.2 dynamic_cast 主要用于执行安全的向下转型(safe downcasting),也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。用法:dynamic_cast type-id(expression)该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。 向上转换,比较安全,不再举例。 向void*转换 如果type-id是一个void*,运行时检查将决定表达式的实际类型。结果是一个到expression指向的完整对象。例如: class A{.}; class B{.}; void f() { A*pa=new A; B*pb=new B; void*pv=dynamic_cast void*(pa); //pv指向一个A类型的对象 pv=dynamic_cast void*(pb); //pv指向一个B类型的对象 } 向下转换 如果type-id不是void*,运行时检查指向expression的对象能否转换为指向type-id类型的对象。 如果expression类型是type-id的基类,运行时检查是否expression实际是一个指向type-id类型的完整对象,如果是,结果返回指向type-id类型的完整对象,否则返回NULL。例如: class B{.}; class D:public B{.}; void f() { B*pb=new D;//unclear but ok B*pb2=new B; //判断一个基类指针指向的对象是否是一个指定子类型 D*pd=dynamic_cast D*(pb);//ok:pb实际指向D,返回D* D*pd2=dynamic_cast D*(pb2);//pb2实际指向B而不是D,转换失败,pd2是NULL } 在多重继承的情况,可能导致二义性。 看一下下面的类继承层次: 指向类型D的指针转换为B或C都正常,但如果从D转换到A将会怎么样来?这个结果导致转换的二义性错误;为了结果这个问题,你可以指向两次明确的转型,例如: void f() { D*pd=new D; A*pa=dynamic_cast A*(pd);//错误:二义性 B*pb=dynamic_cast B*(pd);//首先转换到B A*pa2=dynamic_cast A*(pb);//ok:明确的 } 在使用虚基类的时候就导致更复杂的模糊;看下面的类层次图: 在这个继承层次中,A是虚基类。假定一个类E的实例并且一个指向A子对象的指针,一次到B的dynamic_cast会由于不明确性导致失败,你必须首先转换到适当的层次,然后再向上转换到确定的层次,一直按照这种方式直到到达正确的B对象。 看下面的类层次图: 假定一个类型E的对象和一个指向D子对象的指针,从D子对象导航到左上A
您可能关注的文档
最近下载
- 管材安装合同范本(12篇).docx VIP
- 滇人版 七年级 第九册 第10课 文件合并与超链接课件.pptx VIP
- 古镇商业运营与旅游开发思路.pptx VIP
- 02S515排水检查井图集.pdf VIP
- 标准图集-23S519-小型排水构筑物.pdf VIP
- 形考作业(五)配置DNS服务实训.docx VIP
- 高钾血症应急演练脚本.docx VIP
- xx河防洪治理工程施工组织设计.doc VIP
- 新解读《GB_T 17934.3-2021印刷技术 网目调分色版、样张和生产印刷品的加工过程控制 第3部分:新闻纸冷固型平版胶印》必威体育精装版解读.pptx VIP
- 简式数控车床使用说明书(中英文).pdf VIP
有哪些信誉好的足球投注网站
文档评论(0)