August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
在使用指针和自由空间分配的数组时,我们非常接近硬件层面。基本上,我们对指针的操作(初始化、分配、*和[])直接映射为机器指令。在这个层次,语言只提供一点儿表示上的便利以及由类型系统提供的编译时的一致性。偶尔,我们不得不放弃这最后一点儿保护。
通常,我们不希望在没有类型系统的保护下工作,但是有时没有其他选择(例如,我们需要与无法识别C++类型的其他语言交互)。我们有时也会遇到一些不走运的情况,这时需要面对没有遵循静态安全类型设计的旧代码。在这种情况下,我们需要两样东西:
·一种并不了解内存中是哪种对象的指针。
·一个操作,告知编译器指针指向的内存中是哪种(未证实)类型的对象。
类型void*的含义是“指向编译器不知道类型的内存空间”。当我们想在两段代码之间传输一个地址,它们确实不知道对方的类型时,就可以使用void*。这方面的例子包括回调函数的“地址”参数(见21.3.1节)和底层内存分配器(例如new运算符的实现)。
并不存在void类型的对象,但是正如我们看到的,我们通常用void来表示“没有返回值”:
指向任何对象类型的指针都可以赋予void*。例如:
由于编译器不知道void*指向什么,因此我们必须告诉它:
static_cast可以用于在两种相关指针类型之间进行强制转换,例如void*与double*(见附录A.5.7)。名字static_cast是故意为一个丑陋的(且危险的)操作起的一个丑陋的名字,你只应在绝对必要时才使用它。你经常会发现其实没有必要使用。static_cast这样的操作称为显式类型转换(explicit ...