August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
析构函数概念上很简单,但它是大多数最有效的C++编程技术的基础。基本思想是:
·无论一个类对象需要使用哪些资源,这些资源都要在构造函数中获取。
·在对象的生命周期中,它可以释放资源并获得新的资源。
·在对象的生命周期结束后,析构函数释放对象拥有的所有资源。
在vector中用一对构造函数、析构函数处理自由空间内存就是这一思想的一个典型例子。我们将在14.5节中提供这种思想的更多例子。本节将考察一个重要的应用,它结合使用了自由空间和类层次。考虑下面代码:
这段代码看起来很合理,事实也的确如此,它运行一切正常。不过让我们分析一下它是如何做到的,这段代码揭示了一些精巧、重要和简单的技术。在函数fct()中,Text(见18.11节)对象tt在离开函数时被正确销毁。Text有一个string成员,很明显需要调用它的析构函数——string像vector一样处理内存的获取和释放。对于tt,正确销毁是很容易的;编译器只需像12.5.1节中描述的那样调用Text的生成析构函数即可。但是,从fct()返回的Text对象会怎样?调用者f()完全不了解q指向一个Text,它所知道的是q指向一个Shape。delete q如何调用Text的析构函数?
在19.2.1节中,我们快速地介绍了Shape的析构函数。实际上,Shape的析构函数是virtual的,这就是问题的关键。当我们使用delete q时,delete会查看q的类型,以确定是否需要调用析构函数,如果需要的话就调用它。因此,delete ...