《C++ Primer》第15章 面向对象程序设计
15.7节 构造函数与拷贝控制 习题答案
练习15.24:哪种类需要虚析构函数?虚析构函数必须执行什么样的操作?
【出题思路】
熟悉虚析构函数的知识。
【解答】
作为基类使用的类应该具有虚析构函数,以保证在删除指向动态分配对象的基类指针时,根据指针实际指向的对象所属的类型运行适当的析构函数。虚析构函数可以为空,即不执行任何操作。一般而言,析构函数的主要作用是清除本类中定义的数据成员。如果该类没有定义指针类成员,则使用合成版本即可;如果该类定义了指针成员,则一般需要自定义析构函数以对指针成员进行适当的清除。因此,如果有虚析构函数必须执行的操作,则就是清除本类中定义的数据成员的操作。
练习15.25:我们为什么为Disc_quote定义一个默认构造函数?如果去掉该构造函数的话会对Bulk_quote的行为产生什么影响?
【出题思路】
理解基类或派生类的合成拷贝控制的知识。
【解答】
因为Disc_quote的默认构造函数会运行Quote的默认构造函数,而Quote默认构造函数会完成成员的初始化工作。
如果去掉该构造函数的话,Bulk_quote的默认构造函数而无法完成Disc_quote的初始化工作。
练习15.26:定义Quote和Bulk_quote的拷贝控制成员,令其与合成的版本行为一致。为这些成员以及其他构造函数添加打印状态的语句,使得我们能够知道正在运行哪个程序。使用这些类编写程序,预测程序将创建和销毁哪些对象。重复实验,不断比较你的预测和实际输出结果是否相同,直到预测完全准确再结束。
【出题思路】
本题考查基类和派生类的构造函数与析构函数的调用过程。
【解答】
#include
#include
#include using namespace std;class Quote
{
public:Quote() &#61; default;Quote(const std::string &book &#61; "", double sales_price &#61; 0.0):bookNo(book), price(sales_price){cout <<"Quote constructor is running&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" <};ostream& operator <<(ostream &os, Quote &e)
{os <<"\tUsing operator <<(ostram &, Quote &);" <}class Bulk_quote: public Quote
{
public:Bulk_quote(const string &book &#61; "", double sales_price &#61; 0.0, size_t qty &#61; 0, double disc &#61; 0.0):Quote(book, sales_price), min_qty(qty), discount(disc){cout <<"Bulk_constructor is running" <};ostream &operator <<(ostream &os, Bulk_quote &bq)
{os <<"\tUsing operator <<(ostram &, Bulk_quote &)" <}int main(int argc, const char *argv[])
{Quote base("C&#43;&#43; Primer", 128.0);Bulk_quote bulk("Core Python Programming", 89, 5, 0.9);cout <}
运行结果&#xff1a;