C++Primer第五版 7.5.2节练习

练习7.41:使用委托构造函数重新编写你的Sales_data类,给每个构造函数体添加一条语句,令其一旦执行就打印一条信息。用各种可能的方式分别创建Sales_data对象,认真研究每次输出的信息直到你确实理解了委托构造函数的执行顺序。
答:见云盘程序 练习7.41.cpp

练习7.42:对于在练习7.40(参见7.5.1节,第261页)中编写的类,确定哪些构造函数可以使用委托,如果可以的话,编写委托构造函数。如果不可以,从抽象概念列表中重新选择一个你认为可以使用委托构造函数的,为挑选出的这个概念编写类定义。
答: 见云盘程序 练习7.42.cpp

练习7.41

/*
*练习7.41
*日期:2015/7/17 
*问题描述:使用委托构造函数重新编写你的Sales_data类,给每个构造函数体添加一条语句,令其一旦执行就打印一条信息。用各种方式分别创建Sales_data对象,认真研究每次输出的信息直到你确实理解了委托构造函数的执行顺序
*功能:理解委托构造函数的执行顺序
*说明:在练习7.21的基础上进行改动
*作者:Nick Feng
*邮箱:邮箱:nickgreen23@163.com  
*/ 

/*
*练习7.21
*日期:2015/7/6 
*问题描述:练习7.21:修改你的Sales_data类使其隐藏实现的细节。你之前编写的关于Sales_data操作的程序应该继续使用,借助类的新定义重新编译该程序,确保其工作正常。
*功能;使用访问说明符 
*作者:Nick Feng 
*邮箱:nickgreen23@163.com 
*/

#include <iostream>
#include <string>

using namespace std;

class Sales_data{
public:
    friend istream &read(istream &, Sales_data &);//一个友元函数read,便于Sales_data类直接访问 
    friend ostream &print(ostream &os, const Sales_data &item);
    //Sales_data() = default;//默认构造函数 
    //Sales_data(const std::string &s) : bookNo(s){ }
    Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p*n){ cout << "I am Sales_data(const std::string &s, unsigned n, double p)" <<endl; }
    Sales_data(std::istream &is){
        read(is,*this);
        cout << "I am Sales_data(std::istream &is)!" << endl;
    }

    Sales_data() : Sales_data("",0,0) {cout << "I am Sales_data()" << endl;}
    Sales_data(std::string s) : Sales_data(s,0,0) { cout << "I am Sales_data(std::string s)" << endl;}


    string isbn() const {return bookNo;}
    Sales_data& combine(const Sales_data&);
    double avg_price() const;

private:
    string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);

double Sales_data::avg_price() const{
    if (units_sold)
        return revenue/units_sold;
    else 
        return 0;
}

Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}

istream &read(istream &is, Sales_data &item)
{
    double price = 0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = price * item.units_sold;
    return is; 
}

ostream &print(ostream &os, const Sales_data &item){
    os << item.isbn() << " " << item.units_sold << " "
       << item.revenue << " " << item.avg_price();
    return os;
}

Sales_data add(const Sales_data &lhs, const Sales_data &rhs){
    Sales_data sum = lhs;
    sum.combine(rhs);
    return sum;
}

/* 
Sales_data::Sales_data(std::istream &is)
{
    read(is,*this);
}
*/

int main()
{
    Sales_data s;
    cout << endl; 

    Sales_data s1("Hero!I am");//调用第一种构造函数 
//  print(cout, s1);
    cout << endl;

    Sales_data s2("Hero!I am",10,20);//调用第二种构造函数 
    //print(cout,s2);
    cout << endl;

    Sales_data s3(cin);//调用第三种构造函数 
    //print(cout,s3);
    //cout << endl;
    return 0;
}

练习7.42

/*
*练习7.42 
*问题描述:练习7.42:对于你在练习7.40(参见7.5.1节,第261页中编写的类,确定哪些构造函数可以使用委托。如果可以的话,编写构造函数。如果不可以,从抽象概念列表中重新选择一个你认为可以使用委托构造函数的,为挑选出的这个概念编写类定义 
*说明:理解委托构造函数的概念 
*作者:Nick Feng 
*邮箱:NickGreen23@163.com 
*/

#include <iostream>
#include <string> 

using namespace std;

class Employee{
public:
    friend ostream& print(ostream &,Employee&); 
    Employee(string na, char se,int ag, string com_ID, string com_Name) : name(na), sex(se),age(ag),company_ID(com_ID),company_Name(com_Name) {}
    Employee() : Employee("None",'F',0,"UNKNOW","UNKNOW") { }
    Employee(string na, char se, int ag) : Employee(na,se,ag,"UNKNOW","UNKNOW") {}

private:
    string name;
    char sex;
    int age;
    string company_ID;
    string company_Name;
};

ostream& print(ostream &os, Employee &item)
    {
        os << item.name << "\n" << item.sex << "\n" << item.age << "\n" << item.company_Name << "\n" << item.company_ID << "\n";    
    }

int main()
{
    Employee em1("Nick",'F',26,"9527","GDSK");
    print(cout,em1);
    cout << endl;

    Employee em2;
    print(cout,em2);
    cout << endl;

    Employee em3("Tom",'F',27);
    print(cout,em3);
    cout << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值