14.2 输入和输出运算符
类需要自定义IO
操作的>>
输入和<<
输出运算符
14.2.1 重载输出运算符
- 第一个参数是非常量的
ostream
对象的引用- 第二个参数是常量的类类型的引用
ostream& operator<<(ostream& os, const Sales_data& item) {
os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
return os;
}
通常,输出运算符不应该打印换行符
输入输出运算符必须是非成员函数
IO
运算符通常需要读写类的非公有数据成员,所以一般声明为友元
14.2.2 重载输入运算符
- 第一个形参是将要读取的流的引用
- 第二个形参是将要读入到的非常量对象的引用
istream& operator>>(istream& is, Sales_data& item) {
double price;
is >> item.bookNo >> item.units_sold >> price;
if (is) // 检查输入是都成功
item.revenue = item.units_sold * price;
else // 输入失败,赋予默认状态
item = Sales_data();
return is;
}
- 输入运算符必须处理输入可能失败的情况,而输出运算符不需要
- 当读取操作发生错误时,输入运算符应该从错误中恢复