C++Primer第五版 7.5.2节练习

时间:2023-02-14 13:44:36

练习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;
}