已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
static_cast、dynamic_cast、const_cast作用C-style cast举例:int i;double d;i = (int) d;上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d本身的值并没有发生改变)。这就是典型的c-style类型转换。下面是一个简单的程序:#include using namespace std;int main(void) int i; double d = 11.29; i = (int)d; cout i endl; cout d endl; return 0;输出结果:1111.29我们发现d值本身并没有发生任何变化。在简单的情况下,上面这种类型转换可以很好地工作,但在C+中往往还是不够的,为此ANSI-C+新标准定义的四个转换符,即static_cast、dynamic_cast、reinterpret_cast和const_cast。同时在C+环境中,原先的C-Style的类型转换仍旧可以使用。1) static_cast用法:static_cast (expression)说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。用途: a)用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是 安全的;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。 b)用于基本数据类型之间的转换,如把int转换成char,这种转换的安全性也要由开发人员来保证。 c)可以把空指针转换成目标类型的空指针(null pointer)。 d)把任何类型的表达式转换成void类型。注意:static_cast不能转换掉expression的const、volitale或者_unaligned属性。2) dynamic_cast用法:dynamic_cast (expression)说明:该运算符把expression转换成typeid类型的对象。typeid必须是类的指针、类的引用或者void*。如果typeid是类的指针类型, 那么expression也必须是指针,如果typeid是一个引用,那么expression也必须是一个引用。一般情况下,dynamic_cast用 于具有多态性的类(即有虚函数的类)的类型转换。 dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型, 这种检查不是语法上的,而是真实情况的检查。先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息 的,这也就意味着,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型,这时候,dynamic_cast只能 用来做安全的转换,例如从派生类指针转换成基类指针。而这种转换其实并不需要dynamic_cast参与。也就是说,dynamic_cast 是根据RTTI记载的信息来判断类型转换是否合法的。用途:主要用于类层次之间的up-casting和down-casting,还可以用于类之间的交叉转换。在进行down-casting时,dynamic_cast 具有类型检查的功能,比static_cast更安全。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针, 返回值为NULL。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里 (注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有 效的完整对象。注意:dynamic_cast不能转换掉expression的const、volitale或者_unaligned属性。3) reinterpret_cast用法:reinterpret_cast (expression)说明:转换一个指针为其他类型的指针,也允许将一个指针转换为整数类型,反之亦然。这个操作符能够在非相关的类型之间进行 转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝,在类型之间指向的内容不做任何类型的检查和转换。这 是一个强制转换。使用时有很大的风险,慎用之。注意:reinterpret _cast不能转换掉expression的const、volitale或者_unaligned属性。4) const_cast用法:const_cast(expression)说明:这个类型操纵传递对象的const属性,或者是设置或者是移除。如: Class C const C* a = new C; C* b = const_cast(a);如果将上面的const_cast转换成其他任何其他的转换,编译都不能通过,出错的信心大致如下: “cannot convert from const class C * to class C *”。下面的代码是4中casting方法的典型用法示例: #include usingnamespace std; class Base public: int _base; virtualvoid printinfo() cout _base endl; ; class Derived : public Base public: int _derived; virtualvoid printinfo() cout _derived endl; ; int main(void) Base b1; Derived d1; int aInt = 10; long aLong = 11; float aFloat = 11.11f; double aDouble = 12.12; Derived* pd = static_cast(&b1); / down-casting不安全 Base* pb = static_cast(&d1); / up-casting安全 Derived& d = static_cast(b1); / down-casting不安全 Base& b = static_cast(d1); / up-casting安全 aInt = static_cast(aFloat); /基本数据类型转换 void* sth = static_cast(&aDouble); /将double指针类型转换成void指针类型 double* bDouble = static_cast(sth); /将void指针类型转换成double指针类型 cout *bDouble endl; Base* pb1 = dynamic_cast(&d1); /Derived* pd1 = dynamic_cast(&b1); /编译时有warning,运行时出错 int bInt = reinterpret_cast(pb1); /将地址或指针转换成整数 cout bInt endl; pb1 = reinterpret_cast(bInt); /将整数转换成地址或指针 int* cInt = reinterpret_cast(&aFloat); /这个转换的结果会出乎意料 cout (int)*cInt endl; const Base* bBase = new Base(); Base* cBase = const_cast(bBase); /Base* dBase = dynamic_cast(bBase); /不能通过编译 /Base* eBase = static_cast(bBase); /不能通过编译 /Base* fBase = reinterpret_cast(bBase); /不能通过编译 return 0;补充:dynamic_cast的注意事项:dynamic_cast转换符只能用于指针或者引用。dynamic_cast转换符只能用于含有虚函数的类。dynamic_cast转换操作符在执行类型转换时首先将检查能否成功转换,如果能成功转换则转换之,如果转换失败,如果是指针则反回一个0值,如果是转换的是引用,则抛出一个bad_cast异常,所以在使用dynamic_cast转换之间应使用if语句对其转换成功与否进行测试,比如pd=dynamic_cast(pb); if(pd)else,或者这样测试if(dynamic_cast(pb)else。const_cast操作符:其表达式为const_cast(表达式),其中类型指要把表达式转换为的目标类型。该操作符用于改变const和volatile,const_cast最常用的用途就是删除const属性,如果某个变量在大多数时候是常量,而在某个时候又是需要修改的,这时就可以使用const_cast操作符了。const_cast操作符不能改变类型的其他方面,他只能改变const或volatile,即const_cast不能把int改变为double,但可以把const int改变为int。const_cast只能用于指针或引用。const_cast的用法举例比如:int a=3; const int *b=&a; int* c; c=const_cast(b); *c=4; couta*c;这时输出两个4,如果不使用const_cast转换符则常量指针*c的值是不能改变的,在这里使用const_cast操作符,通过指针b就能改变常量指针和变量a的值。static_cast操作符:该操作符用于非多态类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 催收江苏地区代理商未支付货款事宜的紧急通知函(4篇)范文
- 物联网设备设计与开发手册
- 签订软件开发意向确认函(3篇)
- 2026年档案管理员岗位专业知识测试试卷
- 2026年建筑工程技术人员考试冲刺押题卷
- 培训计划及活动组织实施计划确认函4篇范本
- 2026年金融学投资分析能力冲刺押题卷
- 2026年兽医检验检疫员专项训练试卷解析
- 威海市古寨中学2027届毕业升学考试模拟卷物理卷含解析
- 农业科技农业项目执行人员绩效考评表
- 长沙市“星斗”工程2026年教育类硕博人才选拔460名备考题库有答案详解
- 雨课堂学堂在线学堂云传统运动养生学成都中医药大学单元测试考核答案
- 宝安区老虎坑垃圾焚烧发电厂三期工程环境影响评价报告
- 全国大学生职业规划大赛《法学》专业生涯发展展示【获省级一等奖】
- 英语读书会三分钟分享
- 内勤人员管理办法
- TSG-21-2016-固定式压力容器安全技术监察规程
- 银行网点保洁服务流程与标准
- 中职高教版(2023)语文职业模块-第五单元:走近大国工匠(一)展示国家工程-了解工匠贡献【课件】
- 担保物权课件教学课件
- 中国银行同业定期存款合同书
评论
0/150
提交评论