- 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中的四种转型操作符
? C++中的四种转型操作符 分类:?C++之技术2014-08-11 00:09?164人阅读?评论(0)?收藏?举报 c++转型编译器宏exception ①它几乎允许将任何类型转换为任何其他类型,这是十分拙劣的。如果每次转型都能够更精确地指明意图,则更好。 ②旧式转型难以辨识。旧式转型的语法结构是由一对小括号加上一个对象名称组成,而小括号和对象名称在C++的任何地方都有可能被使用。 为解决C旧式转型的缺点,C++导入了4个新的转型操作符:static_cast、const_cast、dynamic_cast、reinterpret_cast。下面我来一一分析这四种转型操作符。 1)static_cast static_cast基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。例如,不能够利用static_cast将一个struct转型为int,或将一个double转型为pointer;这些都是C旧式转型动作原本就不可以完成的任务。static_cast甚至不能够移除表达式的常量性。 int a,b; ... double c = static_castdouble(a)/b; 2)const_cast const_cast用来改变表达式中的常量性(constness)或变易性(volatileness)。使用const_cast,便是对人类(以及编译器)强调,通过这个转型操作符,我们唯一想改变的是某物的常量性或变易性。如果将const_cast应用于上述以为的用途,那么转型动作会被拒绝。下面看一个例子: class Widget{...}; class SpecialWidget:public Widget {...}; void update(SpecialWidget* psw); SpecialWidget sw;//sw是个non-const对象 const SpecialWidget csw = sw;//csw却是一个代表sw的reference,并视之为一个const对象 update(csw);//错误!不能讲const SpecialWidget*传给一个需要SpecialWidget*的函数 update(const_castSpecialWidget*(csw));//可!csw的常量性被去除了。也因此,csw(亦即sw)在此函数中可被更改。 update((SpecialWidget*)csw);//情况同上,但使用的是较难辨识的c旧式转型语法 Widget* pw = new SpecialWidget; update(pw);//错误!pw的类型是Widget*,但update()需要的却是SpecialWidget*。 update(const_castSpecialWidgt*(pw));//错误!const_cast只能用来影响常量性或变易性,无法进行继承体系的向下转型动作。 3)dynamic_cast ①dynamic_cast用来执行继承体系中”安全地向下转型或跨系转型动作“。也就是说你可以利用dynamic_cast,将”指向base class objects的pointers或references“转型为”指向derived(或sibling base)class objects的pointers或references“,并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是reference)表现出来: Widget* pw; ... update(dynamic_castSpecialWidget*(pw));//很好,传给update()一个指针,指向pw所指的SpecialWidget----如果pw真的指向这样的东西;否则传过去的将是一个null指针 void updateViaRef(SpecialWidget rsw); updateViaRef(dynamic_castSpecialWidget(*pw));//很好,传给updateViaRef()的是pw所指的SpecialWidget----如果pw真的指向这样的东西;否则抛出一个exception dynamic_cast只能用来助你巡航于继承体系之下。它无法应用在缺乏虚函数的类型身上,也不能改变类型的常量性。 ②dynamic_cast的第二个用途是找出被某对象占用的内存的起始点。例如: class HeapTracked { public: ???? bool isOnheap() const; private: ???? typedef const void* RawAddress; ???? static listRawAddr
文档评论(0)