关于Cpp的强制类型转换总结

上传人:飞*** 文档编号:3509470 上传时间:2017-08-06 格式:DOC 页数:5 大小:46.50KB
返回 下载 相关 举报
关于Cpp的强制类型转换总结 _第1页
第1页 / 共5页
关于Cpp的强制类型转换总结 _第2页
第2页 / 共5页
关于Cpp的强制类型转换总结 _第3页
第3页 / 共5页
关于Cpp的强制类型转换总结 _第4页
第4页 / 共5页
关于Cpp的强制类型转换总结 _第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《关于Cpp的强制类型转换总结 》由会员分享,可在线阅读,更多相关《关于Cpp的强制类型转换总结 (5页珍藏版)》请在金锄头文库上搜索。

1、关于 C+的强制类型转换以下内容整理自互联网。整理人:Lybe Liu文中教材指的是+语言程序设计(第版) ,作者是郑莉等,清华大学出版社会出版。教材上提到这 4 种转换的地方分别是:P36(概述), P244(reinterpret_cast),P246(const_cast),P337显式转换也被称为强制类型转换(cast),包括下列命名的强制类型转换操作符static_cast dynamic_cast const_cast 和 reinterpret_cast。static_cast、const_cast 和 reinterpret_cast 三种类型转换操作符的功能,都可以用标准 C

2、+之前的两种类型转换语法来描述。之所以细分,是为了“语义更加明确,也就不容易出错” 。static_cast它用来进行比较安全的、基于内容的数据类型转换(编译器会生成代码进行转换) 。基本数据类型之间的转换都适用于 static_cast。用法:static_cast ( exdivssion )该运算符把 exdivssion 转换为 type-id 类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查

3、,所以是不安全的。用于基本数据类型之间的转换,如把 int 转换成 char,把 int 转换成 enum。这种转换的安全性也要开发人员来保证。把空指针转换成目标类型的空指针。把任何类型的表达式转换成 void 类型。注意:static_cast 不能转换掉 exdivssion 的 const、 volatile、或者_unaligned 属性。例子: class B . ;class D : public B . ;void f(B* pb, D* pd)D* pd2 = static_cast(pb); / 不安全, pb 可能只是 B 的指针B* pb2 = static_cast(p

4、d); / 安全的.reinterpret_cast任何指针都可以转换成其它类型的指针,T 必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。表达式 reinterpret_cast( a )能够用于诸如 char* 到 int*,或者 One_class* 到 Unrelated_class*等类似这样的转换,因此可能是不安全的。例子:class A . ;class B . ;void f()A* pa = new A;void* pv = reinterpret_cast(pa);/ pv 现在指向了一个类型为 B 的对象,这可能是不安全的.reinterpre_ca

5、st 通常对于操作数的位模式执行一个比较低层次的重新解释,它的正确性很大程度上依赖于程序员的主动管理。A reinterpret_cast generally performs a low-level reinterpretation of the bit pattern of its operands, and its correctness in large part depends on the active management of the programmer.const_cast将数据类型中的 const 属性去除。表达式 const_cast( a )被用于从一个类中去除以下这

6、些属性: const, volatile, 和 _unaligned。例子 1:void foo(const int *cp)int *p = const_cast(cp); / 转换以后通过得到的指针修改 cp 指向的常量。(*p)+; 例子 2:class A . ;void f()const A *pa = new A; / const 对象A *pb; / 非 const 对象/ pb = pa; / 这里将出错,不能将 const 对象指针赋值给非 const 对象pb = const_cast(pa); / 现在 OK 了.dynamic_cast通常在基类和派生类之间转换时使用,

7、 是 run-time cast。dynamic_cast 支持在运行时刻识别由指针或引用指向的类对象(The dynamic_cast supports the run-time identification of class objects addressed either by a pointer or reference.)转换前类型必须是指向多态类型的指针(即要有虚函数) ,或多态类型的引用,否则编译会出错。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表。用法:dynamic_cast( a )该运算符把 a 转换成 T 类型的对象。T 必须是类的指针、类的引

8、用或者 void *;如果 T 是类指针类型,那么 a 也必须是一个指针,如果 T 是一个引用,那么 a也必须是一个引用。它可以将基类的指针或引用转换为派生类的指针或引用。它在转换前会检查指针(或引用)所指向对象的实际类型是否与转换的目的类型兼容,如果兼容转换才会发生,才能得到派生类的指针(或引用) ,否则: 如果执行的是指针类型的转换,会得到空指针; 如果执行的是用引用类型的转换,会抛出异常。例子 1:class A . ;class B . ;void f()A* pa = new A;B* pb = new B;void* pv = dynamic_cast(pa);/ pv 现在指向了一个类型为 A 的对象.pv = dynamic_cast(pb);/ pv 现在指向了一个类型为 B 的对象例子 2: 见教材 P337

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号