标准C 类型转换符 vs C风格的强制类型转换.doc

标准C 类型转换符 vs C风格的强制类型转换.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
标准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子对象导航到左

文档评论(0)

feixiang2017 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档