C++ Primer 第五版 中文版 练习 14.3
题目:为Sales_data 编写重载的输入、输出、加法和复合赋值运算符
答:
Sales_data.h
/*
Sales_data.h
定义Sales_data类 相关成员函数和相关成员数据。
*/
#include <iostream>
#include <string>
using std::ostream;
using std::istream;
using std::string;
struct Sales_data
{
Sales_data() = default; // 默认构造函数
Sales_data(const string &s) :bookNo(s) // 只为bookNo初始化,其它成员让编译器赋默认值
{
}
Sales_data(const string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(p*n) // 全部成员都初始化
{
}
Sales_data(istream &); //从 istram中读取一条信息进行初始化
string isbn() const { return bookNo; } // 返回对象的ISNB编号
Sales_data & combine(const Sales_data&); // 将一个Sales_data对象加到另一个对象上
double avg_price() const; //售出书籍的平均价格
string bookNo; // ISBN编号
unsigned units_sold = 0; // 某本书的销量
double revenue = 0.0; //总销售收入
};
Sales_data operator+(const Sales_data &, const Sales_data &);
ostream &operator<<(ostream&, const Sales_data &);
istream &operator>>(istream&, Sales_data &);
Sales_data.cpp
/*
Sales_data.cpp
定义Sales_data 成员函数
*/
#include "Sales_data.h"
Sales_data::Sales_data(istream &is)
{
is >> *this;
}
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;
}
Sales_data operator+(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs;
sum.combine(rhs);
return sum;
}
ostream &operator<<(ostream &output, const Sales_data &item)
{
output << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
return output;
}
istream &operator>>(istream &input, Sales_data &item)
{
double price = 0;
input >> item.bookNo >> item.units_sold >> price;
item.revenue = price*item.units_sold;
return input;
}