August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
在程序的执行过程中,构造函数与析构函数都将在明确的、可预计的时间点上被调用。但是,我们并不总是以显式方式(如vector(2))调用它们,我们在做某些事的时候也会调用这些函数——如声明一个vector对象、以传值方式传递一个vector参数或者用new在自由空间上创建一个vector。这可能会造成人们语法上的混淆,因为不只有一种触发构造函数的语法。我们可以更简单地看待构造函数和析构函数的调用:
·每当类型X的一个对象被构建时,类型X的一个构造函数将被调用。
·每当类型X的一个对象被销毁时,类型X的析构函数将被调用。
每当一个类对象被销毁时,该类的析构函数将被调用;这种情况可能发生在变量的作用域结束时、程序结束时或者delete用于一个指向对象的指针时。每当一个类对象被构建时,该类的一个(恰当的)构造函数将被调用;这种情况可能发生在变量初始化时、用new创建对象(内置类型除外)时,以及拷贝对象时。
但这些情况什么时候会发生?体会它们的一个好办法是向构造函数、赋值操作和析构函数添加打印语句,然后尝试运行程序。例如:
这样,我们对X做的任何事情都会留下踪迹以供学习。例如:
试一试执行这一程序。
试一试
运行这一程序示例并确保你能够弄清结果的含义。如果你这么做了,你就能够明白对象的构造与析构的大致过程。 ...