输入和输出运算符
Posted xiaojianliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入和输出运算符相关的知识,希望对你有一定的参考价值。
重载输出运算符
通常情况下,输出运算符第一个形参是一个非常量 ostream
对象的引用。之所以使用 ostream
是非常量是因为向流写入内容会改变其状态;而形参是引用是因为无法直接复制一个 ostream
对象。
第二个形参一般来说是一个常量的引用,该常量表示想要打印的类类型。采用引用可以避免复制实参;之所以是常量是因为通常情况下打印对象不会改变对象的内容。
operator<<
一般要返回它的 ostream
形参。
ostream &operator<<(ostream&os,const Sales_data &item)
{
os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
return os;
}
注意:
通常,输出运算符应该主要负责打印对象的内容而非控制格式,输出运算符不应该打印换行符。
输入输出运算符必须是非成员函数
与 iostream 标准库兼容的输入输出运算符必须是普通的非成员函数,而不能是类的成员函数,否则,它们的左侧运算对象将是我们类的一个对象:
Sales_data data;
data << cout; //如果operator<< 是Sales_data 的成员
通常 IO
运算符可能需要读写类的非公有数据成员,所以,IO
运算符一般被声明为友元。
重载输入运算符
通常情况下,输入运算符的第一个形参是运算符将要读取的流的引用,第二个形参是要读入到的对象的引用,该运算符返回某个给定流的引用。
istream &operator>>(istream &is,Sales_data &item)
{
double price;
is >> item.boolNo >> item.units_sold >> price;
if(is)
item.revenue = item.units_sold * price;
else
item = Sales_data; //输入失败,对象被赋予默认状态
return is;
}
输入时的错误
输入运算符必须处理输入可能失败的情况,而输出运算符不需要。
执行输入运算符时可能发生的错误:
- 当流含有错误类型的数据时读取操作可能失败。例如在读取完
bookNo
后,输入运算符假定接下来读取的是两个数字,一旦输入的不是数字数据,则读取操作及后续对流的其他使用都将失败。 - 当读取操作到达文件末尾或者遇到输入流的其他错误时也会失败。
程序中没有逐个检查读取操作,而是在读取完成后统一检查:
if(is)
item.revenue = item.units_sold * price;
else
item = Sales_data; //输入失败,对象被赋予默认状态
当读取操作发生错误时,输入运算符应该负责从错误中恢复。
以上是关于输入和输出运算符的主要内容,如果未能解决你的问题,请参考以下文章