定义SaleData类
#ifndef _SALEDATA__
#define _SALEDATA__
#include <string>
#include <iostream>
class SaleData{
//数据成员
private:
std::string bookNo;
unsigned sold = 0;
double revenue = 0.0;
//成员函数
public:
//构造函数
SaleData() = default; //默认构造函数
SaleData(const std::string &s) :bookNo(s) {};
SaleData(const std::string &s, unsigned n, double p) :bookNo(s), sold(n), revenue(n*p) {};
SaleData(std::istream &is); //只声明,类外定义;
std::string isbn() const { return bookNo; } //(类中定义的函数为隐藏的inline函数),只在类中声明则不是;
//重载运算符
SaleData & operator+=(const SaleData &); //SaleData类类型重载复合赋值运算符 +=
//声明友元
friend std::istream &operator>>(std::istream &is, SaleData &item); //SaleData类类型重载运算符 >>,输入
friend std::ostream & operator<<(std::ostream &, const SaleData &); //SaleData类类型重载运算符 >> ,输出
friend bool operator==(const SaleData &, const SaleData &); //SaleData类类型重载运算符 == ,相等
friend bool operator!=(const SaleData &, const SaleData &); //SaleData类类型重载运算符 != ,不等
friend SaleData operator+(const SaleData &, const SaleData &);SaleData类类型重载运算符 + ,相加
};
//后面实现为SaleData类类型重载运算符 >>,输入
std::istream &operator>>(std::istream &is, SaleData &item);
//后面实现为SaleData类类型重载运算符 >>,输出
std::ostream & operator<<(std::ostream &, const SaleData &);
//SaleData类类型重载运算符 == ,相等
bool operator==(const SaleData &, const SaleData &);
//SaleData类类型重载运算符 != ,不等
bool operator!=(const SaleData &, const SaleData &);
//SaleData类类型重载运算符 + ,相加
SaleData operator+(const SaleData &, const SaleData &);
#endif
重载输出运算符<<:参考C++ primer P494
注意:非成员函数要声明为类的友元;
例子:
std::ostream & operator<<(std::ostream &os, const SaleData &item)
{
os << item.isbn() << " " << item.sold << " " << item.revenue << " " << item.avg_value();
return os;
}
重载输入运算符>>:参考C++ primer P495
std::istream &operator>>(std::istream &is, SaleData &item)
{
double price;
is >> item.bookNo >> item.sold >> price; //
while (!(is.good()))//检测流是否处于有效状态
{
//当输入流遇到错误
//可以在此添加提示:
is.clear();//恢复流错误
//重新输入
is >> item.bookNo >> item.sold >> price;
}
item.revenue = item.sold*price;
return is;
}
重载相等运算符==:参考C++ primer P497
bool operator==(const SaleData &item1, const SaleData &item2)
{
//比较每一个数据成员,如果类中的数据成员为其他类类型,则其他类类型必须具有重载了==运算符
return item1.isbn() == item2.isbn() &&
item1.sold == item2.sold &&
item1.revenue == item2.revenue;
}
重载不等运算符!=:参考C++ primer P497
bool operator!=(const SaleData &item1, const SaleData &item2)
{
return !(item1 == item2); //事先重载==运算符
}
重载复合赋值运算符 += 参考C++ primer P500
注意:复合赋值运算符和赋值运算符应该为类的成员函数
SaleData &SaleData::operator+=(const SaleData &item)
{
sold += item.sold;
revenue += item.revenue;
return *this;
}
重载运算符 + 参考C++ primer P497
SaleData operator+(const SaleData &item1, const SaleData &item2)
{
SaleData sum = item1; //事先要重载赋值运算符 =
sum += item2;//事先要重载复合赋值运算符 +=
return sum;
}