C++ 輸入輸出運算符重載
C++ 輸入輸出運算符重載
C++ 能夠使用流提取運算符 >> 和流插入運算符 << 來輸入和輸出內置的數據類型。您可以重載流提取運算符和流插入運算符來操作對象等用戶自定義的數據類型。
在這里,有一點很重要,我們需要把運算符重載函數聲明為類的友元函數,這樣我們就能不用創建對象而直接調用函數。
1. 重載輸入運算符 >>
下面我們以全局函數的形式重載 >>,使它能夠讀入兩個 double 類型的數據,并分別賦值給復數的實部和虛部:
istream & operator>>(istream &in, complex &A){
in >> A.m_real >> A.m_imag;
return in;
}
istream 表示輸入流,cin 是 istream 類的對象,只不過這個對象是在標準庫中定義的。之所以返回 istream 類對象的引用,是為了能夠連續讀取復數,讓代碼書寫更加漂亮,例如:
complex c1, c2;cin>>c1>>c2;
如果不返回引用,那就只能一個一個地讀取了:
complex c1, c2;cin>>c1;cin>>c2;
另外,運算符重載函數中用到了 complex 類的 private 成員變量,必須在 complex 類中將該函數聲明為友元函數:
friend istream & operator>>(istream & in , complex &a);
>>運算符可以按照下面的方式使用:
complex c;cin>>c;
當輸入1.45 2.34后,這兩個小數就分別成為對象 c 的實部和虛部了。cin>> c;這一語句其實可以理解為:
complex c;cin>>c;
2. 重載輸出運算符<<
同樣地,我們也可以模仿上面的形式對輸出運算符>>進行重載,讓它能夠輸出復數,請看下面的代碼:
ostream & operator<<(ostream &out, complex &A){
out << A.m_real <<" + "<< A.m_imag <<" i ";
return out;
}
ostream 表示輸出流,cout 是 ostream 類的對象。由于采用了引用的方式進行參數傳遞,并且也返回了對象的引用,所以重載后的運算符可以實現連續輸出。
為了能夠直接訪問 complex 類的 private 成員變量,同樣需要將該函數聲明為 complex 類的友元函數:(只有靜態函數才能不經創建直接訪問)
friend ostream & operator<<(ostream &out, complex &A);
下面的實例演示了如何重載提取運算符 >> 和插入運算符 <<。
#include <iostream> using namespace std; class Distance { private: int feet; // 0 到無窮 int inches; // 0 到 12 public: // 所需的構造函數 Distance(){ feet = 0; inches = 0; } Distance(int f, int i){ feet = f; inches = i; } friend ostream &operator<<( ostream &output, const Distance &D ) { output << "F : " << D.feet << " I : " << D.inches; return output; } friend istream &operator>>( istream &input, Distance &D ) { input >> D.feet >> D.inches; return input; } }; int main() { Distance D1(11, 10), D2(5, 11), D3; cout << "Enter the value of object : " << endl; cin >> D3; cout << "First Distance : " << D1 << endl; cout << "Second Distance :" << D2 << endl; cout << "Third Distance :" << D3 << endl; return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
$./a.out Enter the value of object : 70 10 First Distance : F : 11 I : 10 Second Distance :F : 5 I : 11 Third Distance :F : 70 I : 10