练习14.9:
#include <iostream>
#include <string>
#include <errno.h>
using namespace std;
class Sales_date {
//将非成员重载函数设置为友元函数
friend Sales_date operator+(const Sales_date& h1, const Sales_date& h2);
friend istream& operator >> (istream& is, Sales_date& item);
friend ostream& operator << (ostream& os, const Sales_date& item);
public:
//默认构造函数
Sales_date():bookNo(std::string()){ }
Sales_date(const std::string& s, unsigned us, double p):bookNo(s), units_sold(us), revenue(p*us) { }
Sales_date(const std::string& s) :bookNo(s) { }
//拷贝构造函数
Sales_date(const Sales_date& s):bookNo(s.bookNo), units_sold(s.units_sold), revenue(s.revenue){ }
//拷贝赋值运算符
Sales_date& operator=(const Sales_date&);
//复合赋值运算符
Sales_date& operator+=(const Sales_date&);
//得到bookNo
std::string isbn()const { return bookNo; }
private:
//平均售价
double avg_price()const { return units_sold ? revenue / units_sold : 0; }
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//拷贝赋值运算符
Sales_date& Sales_date::operator=(const Sales_date& s)
{
bookNo = s.bookNo;
units_sold = s.units_sold;
revenue = s.revenue;
return *this;
}
//复合赋值运算符
Sales_date& Sales_date::operator+=(const Sales_date& s)
{
if (this->bookNo == s.bookNo)
{
units_sold = units_sold + s.units_sold;
revenue = revenue + s.revenue;
return *this;
}
else
{
throw runtime_error("bookNo is different");
}
}
//重载的加法运算符
Sales_date operator+(const Sales_date& h1, const Sales_date& h2)
{
if (h1.bookNo == h2.bookNo)
{
Sales_date sTemp = h1;
sTemp.units_sold = sTemp.units_sold + h2.units_sold;
sTemp.revenue = sTemp.revenue + h2.revenue;
return sTemp;
}
else
{
//无法相加
throw runtime_error("bookNo is different");
}
}
//重载输入运算符
istream& operator >> (istream& is, Sales_date& item)
{
double price;
is >> item.bookNo >> item.units_sold >> price;
//检查输入是否出错
if (is)
{
item.revenue = item.units_sold * price;
}
else
{
cout << "input error" << endl;
//输入失败,对象被赋予默认的状态
item = Sales_date();
}
return is;
}
//重载输出运算符
ostream& operator << (ostream& os, const Sales_date& item)
{
os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
return os;
}
//测试
int main()
{
Sales_date s1;
cin >> s1;
cout <<"经过重载的输入运算符得到的对象为:" << s1 << endl;
system("pause");
return 0;
}
结果:
练习14.10:
(a):程序正常执行,得到如下结果:
(b):输入数据错误,对象的数据被置为默认值
练习14.11:
这个重载运算符的实现没有考虑输入错误的情况,对于错误的输入也照样进行计算,得到的结果会与我们的预期有较大差别‘
对于(a),得到的结果还是一样
对于(b),部分数据被强制类型转换,且数据对应错误,结果也是错误的:
练习14.12:
略,类似练习14.9