C++ 輸入/輸出運(yùn)算符重載

C++ 重載運(yùn)算符和重載函數(shù) C++ 重載運(yùn)算符和重載函數(shù)

C++ 能夠使用流提取運(yùn)算符 >> 和流插入運(yùn)算符 << 來(lái)輸入和輸出內(nèi)置的數(shù)據(jù)類(lèi)型。您可以重載流提取運(yùn)算符和流插入運(yùn)算符來(lái)操作對(duì)象等用戶(hù)自定義的數(shù)據(jù)類(lèi)型。

在這里,有一點(diǎn)很重要,我們需要把運(yùn)算符重載函數(shù)聲明為類(lèi)的友元函數(shù),這樣我們就能不用創(chuàng)建對(duì)象而直接調(diào)用函數(shù)。

重載輸入運(yùn)算符>>

下面我們以全局函數(shù)的形式重載>>,使它能夠讀入兩個(gè) double 類(lèi)型的數(shù)據(jù),并分別賦值給復(fù)數(shù)的實(shí)部和虛部:

istream & operator>>(istream &in, complex &A){
    in >> A.m_real >> A.m_imag;
    return in;
}

istream 表示輸入流,cin 是 istream 類(lèi)的對(duì)象,只不過(guò)這個(gè)對(duì)象是在標(biāo)準(zhǔn)庫(kù)中定義的。之所以返回 istream 類(lèi)對(duì)象的引用,是為了能夠連續(xù)讀取復(fù)數(shù),讓代碼書(shū)寫(xiě)更加漂亮,例如:

complex c1, c2;cin>>c1>>c2;

如果不返回引用,那就只能一個(gè)一個(gè)地讀取了:

complex c1, c2;cin>>c1;cin>>c2;

另外,運(yùn)算符重載函數(shù)中用到了 complex 類(lèi)的 private 成員變量,必須在 complex 類(lèi)中將該函數(shù)聲明為友元函數(shù):

friend istream & operator>>(istream & in , complex &a);

>>運(yùn)算符可以按照下面的方式使用:

complex c;cin>>c;

當(dāng)輸入1.45 2.34后,這兩個(gè)小數(shù)就分別成為對(duì)象 c 的實(shí)部和虛部了。cin>> c;這一語(yǔ)句其實(shí)可以理解為:

complex c;cin>>c;

重載輸出運(yùn)算符<<

同樣地,我們也可以模仿上面的形式對(duì)輸出運(yùn)算符>>進(jìn)行重載,讓它能夠輸出復(fù)數(shù),請(qǐng)看下面的代碼:

ostream & operator<<(ostream &out, complex &A){
    out << A.m_real <<" + "<< A.m_imag <<" i ";
    return out;
}

ostream 表示輸出流,cout 是 ostream 類(lèi)的對(duì)象。由于采用了引用的方式進(jìn)行參數(shù)傳遞,并且也返回了對(duì)象的引用,所以重載后的運(yùn)算符可以實(shí)現(xiàn)連續(xù)輸出。
為了能夠直接訪(fǎng)問(wèn) complex 類(lèi)的 private 成員變量,同樣需要將該函數(shù)聲明為 complex 類(lèi)的友元函數(shù):(只有靜態(tài)函數(shù)才能不經(jīng)創(chuàng)建直接訪(fǎng)問(wèn))

friend ostream & operator<<(ostream &out, complex &A);

下面的實(shí)例演示了如何重載提取運(yùn)算符 >> 和插入運(yùn)算符 <<。

#include <iostream>
using namespace std;
 
class Distance
{
   private:
      int feet;             // 0 到無(wú)窮
      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í),它會(huì)產(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

C++ 重載運(yùn)算符和重載函數(shù) C++ 重載運(yùn)算符和重載函數(shù)