C++ 輸入輸出運(yùn)算符重載
C++ 能夠使用流提取運(yùn)算符 >> 和流插入運(yùn)算符 << 來輸入和輸出內(nèi)置的數(shù)據(jù)類型。您可以重載流提取運(yùn)算符和流插入運(yùn)算符來操作對象等用戶自定義的數(shù)據(jù)類型。
在這里,有一點(diǎn)很重要,我們需要把運(yùn)算符重載函數(shù)聲明為類的友元函數(shù),這樣我們就能不用創(chuàng)建對象而直接調(diào)用函數(shù)。
1. 重載輸入運(yùn)算符 >>
下面我們以全局函數(shù)的形式重載 >>,使它能夠讀入兩個(gè) double 類型的數(shù)據(jù),并分別賦值給復(fù)數(shù)的實(shí)部和虛部:
istream & operator>>(istream &in, complex &A){
in >> A.m_real >> A.m_imag;
return in;
}
istream 表示輸入流,cin 是 istream 類的對象,只不過這個(gè)對象是在標(biāo)準(zhǔn)庫中定義的。之所以返回 istream 類對象的引用,是為了能夠連續(xù)讀取復(fù)數(shù),讓代碼書寫更加漂亮,例如:
complex c1, c2;cin>>c1>>c2;
如果不返回引用,那就只能一個(gè)一個(gè)地讀取了:
complex c1, c2;cin>>c1;cin>>c2;
另外,運(yùn)算符重載函數(shù)中用到了 complex 類的 private 成員變量,必須在 complex 類中將該函數(shù)聲明為友元函數(shù):
friend istream & operator>>(istream & in , complex &a);
>>運(yùn)算符可以按照下面的方式使用:
complex c;cin>>c;
當(dāng)輸入1.45 2.34后,這兩個(gè)小數(shù)就分別成為對象 c 的實(shí)部和虛部了。cin>> c;這一語句其實(shí)可以理解為:
complex c;cin>>c;
2. 重載輸出運(yùn)算符<<
同樣地,我們也可以模仿上面的形式對輸出運(yùn)算符>>進(jìn)行重載,讓它能夠輸出復(fù)數(shù),請看下面的代碼:
ostream & operator<<(ostream &out, complex &A){
out << A.m_real <<" + "<< A.m_imag <<" i ";
return out;
}
ostream 表示輸出流,cout 是 ostream 類的對象。由于采用了引用的方式進(jìn)行參數(shù)傳遞,并且也返回了對象的引用,所以重載后的運(yùn)算符可以實(shí)現(xiàn)連續(xù)輸出。
為了能夠直接訪問 complex 類的 private 成員變量,同樣需要將該函數(shù)聲明為 complex 類的友元函數(shù):(只有靜態(tài)函數(shù)才能不經(jīng)創(chuàng)建直接訪問)
friend ostream & operator<<(ostream &out, complex &A);
下面的實(shí)例演示了如何重載提取運(yùn)算符 >> 和插入運(yùn)算符 <<。
#include <iostream> using namespace std; class Distance { private: int feet; // 0 到無窮 int inches; // 0 到 12 public: // 所需的構(gòu)造函數(shù) 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; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會產(chǎn)生下列結(jié)果:
$./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