关于cpp的强制类型转换总结_第1页
关于cpp的强制类型转换总结_第2页
关于cpp的强制类型转换总结_第3页
关于cpp的强制类型转换总结_第4页
关于cpp的强制类型转换总结_第5页
已阅读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+之前的两种类型转换语法来描述。之所以细分,是为了“语义更加明 确,也就不容易出错” 。 static_cast 它用来进行比较安全的、基于内容的数据类型转换(编译器会生成代码进行转 换) 。基本数据类型之间的转换都适用于 static_cast。 用法:static_cast ( exdivssion ) 该运算符把 exdivssion 转换为 type-id 类型,但没有运行时类型检查来保证转换 的安全性。它主要有如下几种用法: 用于类层次结构中基类和子类之间指针或引用的转换。 进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检 查,所以是不安全的。 用于基本数据类型之间的转换,如把 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(pd); / 安全的 . 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_cast 通常对于操作数的位模式执行一个比较低层次的重新解释,它的 正确性很大程度上依赖于程序员的主动管理。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 )被用于从一个类中去除以下这些属性: 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 通常在基类和派生类之间转换时使用, 是 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 必须是类的指针、类的引用或者 void *; 如果 T 是类指针类型,那么 a 也必须是一个指针,如果 T 是一个引用,那么 a 也必须是一个引用。 它可以将基类的指针或引用转换为派生类的指针或引用。它在转换前会检 查指针(或引用)所指向对象的实际类型是否与转换的目的类型兼容,如果兼 容转换才会发生,才能得到派生类的指针(或引用) ,否则: 如果执行的是指针类型的转换,会得到空指针; 如果执行的是用引用类型的转换,会抛出异常。 例子 1: class A . ; class B . ; void f() A* pa = new A;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论