C++四as操作符的区别.docVIP

  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文档。上传文档
查看更多
C四as操作符的区别

Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。比如,为了转换一个类型为doubole的浮点数的指针到整型: 代码: int i; double d; i = (int) d; 或者: i = int (d); 对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:reinterpret_cast, static_cast, dynamic_cast 和 const_cast,目的在于控制类(class)之间的类型转换。 代码: reinterpret_castnew_type(expression) dynamic_castnew_type(expression) static_castnew_type(expression) const_castnew_type(expression) 1 reinterpret_cast reinterpret_cast转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型。反之亦然。(译注:是指针具体的地址值作为整数值?) 这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。 如果情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任何的实现都不是方便的。一个转换到足够大的整型能够包含它的指针是能够转换回有效的指针的。 代码: class A {}; class B {}; A * a = new A; B * b = reinterpret_castB *(a); reinterpret_cast就像传统的类型转换一样对待所有指针的类型转换。 2 static_cast static_cast允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的) 应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。 在这最后例子里,被转换的父类没有被检查是否与目的类型相一致。 代码: class Base {}; class Derived : public Base {}; Base *a = new Base; Derived *b = static_castDerived *(a); static_cast除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换: 代码: double d = 3 int i = static_castint(d); 3 dynamic_cast dynamic_cast只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。 检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL. 代码: class Base { virtual dummy() {} }; class Derived : public Base {}; Base* b1 = new Derived; Base* b2 = new Base; Derived* d1 = dynamic_castDerived *(b1); // succeeds Derived* d2 = dynamic_castDerived *(b2); // fails: returns NULL 如果一个引用类型执行了类型转换并且这个转换是不可能的,一个bad_cast的异常类型被抛出: 代码: class Base { virtual dummy() {} }; class Derived : public Base { }; Base* b1 = new Derived; Base* b2 = new Base; Derived d1 = dynamic_castDerived *(b1); // succeeds Derived d2 = dynamic_castDerived *(b2); // fails: exception thrown 4 cons

文档评论(0)

linjuanrong + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档