《C++ Primer》第15章 15.7节习题答案

《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 <iostream>
#include <string>
#include <ostream>

using namespace std;

class Quote
{
public:
    Quote() = default;
    Quote(const std::string &book = "", double sales_price = 0.0)
    :bookNo(book), price(sales_price)
    {
        cout << "Quote constructor is running===========" << endl;
    }

    string isbn() const
    {
        return bookNo;
    }

    //返回给定数量的书籍的销售总额,派生类改写并使用不同的折扣计算方法
    virtual double net_price(std::size_t n) const
    {
        return n * price;
    }

    virtual void debug()
    {
        cout << "bookNo = " << bookNo << " price = " << price << endl;
    }

    virtual ~Quote()
    {
        cout << "Quote destructor is running=========" << endl;
    }

    friend ostream &operator << (ostream &, Quote &);

private:
    std::string bookNo;//书籍的ISBN编号

protected:
    double price = 0.0;//代表普通状态下不打折的价格
};

ostream& operator << (ostream &os, Quote &e)
{
    os << "\tUsing operator << (ostram &, Quote &);" << endl;
    return os;
}

class Bulk_quote: public Quote
{
public:
    Bulk_quote(const string &book = "", double sales_price = 0.0, size_t qty = 0, double disc = 0.0)
    :Quote(book, sales_price), min_qty(qty), discount(disc)
    {
        cout << "Bulk_constructor is running" << endl;
    }

    ~Bulk_quote()
    {
        cout << "Bulk_quote destructor is running" << endl;
    }

private:
    size_t min_qty;
    double discount;
};

ostream &operator << (ostream &os, Bulk_quote &bq)
{
    os << "\tUsing operator << (ostram &, Bulk_quote &)" << endl;
    return os;
}

int main(int argc, const char *argv[])
{
    Quote base("C++ Primer", 128.0);
    Bulk_quote bulk("Core Python Programming", 89, 5, 0.9);
    cout << base << endl;
    cout << bulk << endl;
    return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值