Skip to Content
C++程序设计:原理与实践(基础篇)(原书第2版)
book

C++程序设计:原理与实践(基础篇)(原书第2版)

by 本贾尼 斯特劳斯特鲁普
August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
Pearson
Content preview from C++程序设计:原理与实践(基础篇)(原书第2版)

12.8 类型混用:void*和类型转换

在使用指针和自由空间分配的数组时,我们非常接近硬件层面。基本上,我们对指针的操作(初始化、分配、*和[])直接映射为机器指令。在这个层次,语言只提供一点儿表示上的便利以及由类型系统提供的编译时的一致性。偶尔,我们不得不放弃这最后一点儿保护。

通常,我们不希望在没有类型系统的保护下工作,但是有时没有其他选择(例如,我们需要与无法识别C++类型的其他语言交互)。我们有时也会遇到一些不走运的情况,这时需要面对没有遵循静态安全类型设计的旧代码。在这种情况下,我们需要两样东西:

·一种并不了解内存中是哪种对象的指针。

·一个操作,告知编译器指针指向的内存中是哪种(未证实)类型的对象。

类型void*的含义是“指向编译器不知道类型的内存空间”。当我们想在两段代码之间传输一个地址,它们确实不知道对方的类型时,就可以使用void*。这方面的例子包括回调函数的“地址”参数(见21.3.1节)和底层内存分配器(例如new运算符的实现)。

并不存在void类型的对象,但是正如我们看到的,我们通常用void来表示“没有返回值”:

指向任何对象类型的指针都可以赋予void*。例如:

由于编译器不知道void*指向什么,因此我们必须告诉它:

static_cast可以用于在两种相关指针类型之间进行强制转换,例如void*与double*(见附录A.5.7)。名字static_cast是故意为一个丑陋的(且危险的)操作起的一个丑陋的名字,你只应在绝对必要时才使用它。你经常会发现其实没有必要使用。static_cast这样的操作称为显式类型转换(explicit ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

C++语言导学(原书第2版)

C++语言导学(原书第2版)

本贾尼 斯特劳斯特鲁普
管理Kubernetes

管理Kubernetes

Brendan Burns, Craig Tracey
Go程序设计语言

Go程序设计语言

艾伦A. A.多诺万, 布莱恩W. 柯尼汉

Publisher Resources

ISBN: 9787111562252