一:输出操作符
#include<iostream>
using namespace std;
class String
{
friend ostream& operator<<(ostream& os,const ClassType &object);
os<<object;
return os;
}
第一个形参是对 ostream 对象的引用,在该对象上将产生输出。ostream 为非 const,因为写入到流会改变流的状态。该形参是一个引用,因为不能复制ostream 对象。
第二个形参一般应是对要输出的类类型的引用。该形参是一个引用以避免复制实参。它可以是 const,因为(一般而言)输出一个对象不应该改变对象。使形参成为 const 引用,就可以使用同一个定义来输出 const 和非 const 对象。
返回类型是一个 ostream 引用,它的值通常是输出操作符所操作的ostream 对象。
注意:
一般而言,输出操作符应输出对象的内容,进行最小限度的格式化,它们不应该输出换行符。
尽量减少操作符所做格式化,让用户自己控制输出细节。
当定义符合标准库 iostream 规范的输入或输出操作符的时候,必须使它成为非成员操作符。因此类通常将 IO操作符设为友元。
二:输入操作符
class String
{
friend istream&operator>>(istream& in, Sales_item& s)
{
in>>....;
return in;
}
};
与输出操作符类似,输入操作符的第一个形参是一个引用,指向它要读的流,并且返回的也是对同一个流的引用。它的第二个形参是对要读入的对象的非const 引用,该形参必须为非 const,因为输入操作符的目的是将数据读到这个对象中。
更重要但通常重视不够的是,输入和输出操作符有如下区别:输入操作符必须处理错误和文件结束的可能性。
输入期间可能的错误
1. 任何读操作都可能因为提供的值不正确而失败。(如果出现了错误,我们不用关心是哪个输入失败了,相反,我们将整个对象复位)
2. 任何读入都可能碰到输入流中的文件结束或其他一些错误。
设计输入操作符时,如果可能,要确定错误恢复措施,这很重要。