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的專欄