第14章 重载操作符与转换(2)
14.2 输入和输出操作符
支持I/O操作的类所提供的I/O操作接口,一般应该与标准库iostream为内置类型定义的接口相同,因此,许多类都需要重载输入和输出操作符。
14.2.1 输出操作符<<的重载
为了与IO标准库一致,操作符应接受ostream&作为第一个形参,对类类型const对象的引用作为第二个形参,并返回ostream形参的引用。
1. 输出操作符
class Class1
{
public:
int counter;
friend ostream& operator<<(ostream& out, const Class1& c);
public:
Class1(int counter = 100):counter(counter){}
};
ostream& operator<<(ostream& out, const Class1& c)
{
out << "This is Class1!";
out << c.counter;
return out;
}
Class1 c1(200);
cout << c1 << endl;
return 0;
2.输出操作符通常所做格式化应尽量少
一般而言,输出操作符应输出对象的内容,进行最小限度的格式化,它们不应该输出换行符。
尽量减少操作符所做的格式化,让用户自己控制输出细节。
3. IO操作符必须为非成员函数
我们不能将该操作符定义为类的成员,否则,左操作数将只能是该类类型的对象。
相反,如果需要使用重载操作符为该类型提供IO操作,就必须将它们定义为非成员函数。IO操作符通常对非公用数据成员进行读写,因此,类通常将IO操作符设为友元。
14.2 输入操作符>>的重载
输入操作符的第一个形参是一个引用,指向它要读的流,并且返回的也是对同一个流的引用。它的第二个形参是对要读入的对象的非const引用,该形参必须为非const,因为输入操作符的目的是将数据读到这个对象中。
更重要但通常重视不够的是,输入和输出操作符有如下区别:输入操作符必须处理错误和文件结束的可能性。
1. 输入操作符
friend istream& operator>>(istream& in, Class1 &c);
istream& operator>>(istream& in, Class1 &c)
{
int i = c.counter;
in >> c.counter;
if(!in)
c = Class1(i);
return in;
}
设置输入操作符时,如果可能,要确定错误恢复措施,这很重要。
摘自 xufei96的专栏
补充:软件开发 , C++ ,