重载输出运算符
通常情况下,第一个形参为非常量ostream对象的引用,非常量因为对象会修改,引用因为ostream对象不能拷贝;第二个形参通常为常量的引用,常量为要打印的类类型,引用因为我们不想拷贝实参,常量因为我们只是打印不改变原数据;最后返回ostream形参。

ostream &operator<<(ostream &os, const Sales_data &item)
{
    os<< item.isbn() << "" << ... << endl;
    return os;
}

输入输出运算符必须是非成员函数,一般被声明为友元

重载输入运算符
通常情况下,第一个形参为流的引用,第二个形参为读入的非常量对象的引用

istream &operator>>(istream &is, Sales_data &item)
{
    double price;
    is >> item.bookNo >> price;
    if(is)
        item.revenue = item.units_sold * price;
    else
        item = Sales_data();
    return is;
}