练习14.13:
对于Sales_date类我们还可以定义相等运算符==,!=,减法/减等于运算符
#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);
friend bool operator==(const Sales_date& s1, const Sales_date& s2);
friend Sales_date operator-(const Sales_date& s1, Sales_date& s2);
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&);
//减法
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)
{
Sales_date sum = h1;
sum += h2;
return sum;
}
//重载输入运算符
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;
}
//重载相等关系运算符
bool operator==(const Sales_date& s1, const Sales_date& s2)
{
if (s1.isbn() == s2.isbn() && s1.units_sold == s2.units_sold && s1.revenue == s2.revenue)
{
return true;
}
else
{
return false;
}
}
//重载不等关系运算符
bool operator!=(const Sales_date& s1, const Sales_date& s2)
{
//使用上面定义的==运算符来实现
return !(s1 == s2);
}
//重载减法等于运算符
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& s1, Sales_date& s2)
{
Sales_date dec = s1;
dec -= s2;
return dec;
}
//测试
int main()
{
Sales_date s1;
cin >> s1;
cout <<"经过重载的输入运算符得到的对象为:" << s1 << endl;
system("pause");
return 0;
}
练习14.14:
operator+的大部分代码实现与operator+=一样,operator+=会在operator+中被使用,相比于从头实现operator+,调用operator+=显然效率会更高
练习14.15:
略,与练习14.13类似