国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

詳解C++編程中的重載流插入運算符和流提取運算符

2020-01-26 14:51:41
字體:
來源:轉載
供稿:網友

C++的流插入運算符“<<”和流提取運算符“>>”是C++在類庫中提供的,所有C++編譯系統都在類庫中提供輸入流類istream和輸出流類ostream。cin和cout分別是istream類和ostream類的對象。在類庫提供的頭文件中已經對“<<”和“>>”進行了重載,使之作為流插入運算符和流提取運算符,能用來輸出和輸入C++標準類型的數據。因此,凡是用“cout<<”和“cin>>”對標準類型數據進行輸入輸出的,都要用#include 把頭文件包含到本程序文件中。

用戶自己定義的類型的數據,是不能直接用“<<”和“>>”來輸出和輸入的。如果想用它們輸出和輸入自己聲明的類型的數據,必須對它們重載。

對“<<”和“>>”重載的函數形式如下:

  istream & operator >> (istream &, 自定義類 &);  ostream & operator << (ostream &, 自定義類 &);


即重載運算符“>>”的函數的第一個參數和函數的類型都必須是istream&類型,第二個參數是要進行輸入操作的類。重載“<<”的函數的第一個參數和函數的類型都必須是ostream&類型,第二個參數是要進行輸出操作的類。因此,只能將重載“>>”和“<<”的函數作為友元函數或普通的函數,而不能將它們定義為成員函數。
重載流插入運算符“<<”

在程序中,人們希望能用插入運算符“<<”來輸出用戶自己聲明的類的對象的信息,這就需要重載流插入運算符“<<”。

[例] 用重載的“<<”輸出復數。

#include <iostream>using namespace std;class Complex{  public:  Complex( ){real=0;imag=0;}  Complex(double r,double i){real=r;imag=i;}  Complex operator + (Complex &c2); //運算符“+”重載為成員函數  friend ostream& operator << (ostream&,Complex&); //運算符“<<”重載為友元函數  private:  double real;  double imag;};Complex Complex::operator + (Complex &c2)//定義運算符“+”重載函數{  return Complex(real+c2.real,imag+c2.imag);}ostream& operator << (ostream& output,Complex& c) //定義運算符“<<”重載函數{  output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;  return output;}int main( ){  Complex c1(2,4),c2(6,10),c3;  c3=c1+c2;  cout<<c3;  return 0;}

注意,在Visual C++ 6.0環境下運行時,需將第一行改為#include <iostream.h>,并刪去第2行,否則編譯不能通過。運行結果為:

(8+14i)

可以看到在對運算符“<<”重載后,在程序中用“<<”不僅能輸出標準類型數據,而且可以輸出用戶自己定義的類對象。用“cout<<c3”即能以復數形式輸出復數對象c3的值。形式直觀,可讀性好,易于使用。

下面對怎樣實現運算符重載作一些說明。程序中重載了運算符“<<”,運算符重載函數中的形參output是ostream類對象的引用,形參名output是用戶任意起的。分析main函數最后第二行:

  cout<<c3;


運算符“<<”的左面是cout,前面已提到cout是ostream類對象。“<<”的右面是c3,它是Complex類對象。由于已將運算符“<<”的重載函數聲明為Complex類的友元函數,編譯系統把“cout<<c3”解釋為

  operator<<(cout, c3)


即以cout和c3作為實參,調用下面的operator<<函數:

  ostream& operator<<(ostream& output,Complex& c)  {    output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;    return output;  }


調用函數時,形參output成為cout的引用,形參c成為c3的引用。因此調用函數的過程相當于執行:

cout<<″(″<<c3.real<<″+″<<c3.imag<<″i)″<<endl; return cout;


請注意,上一行中的“<<”是C++預定義的流插入符,因為它右側的操作數是字符串常量和double類型數據。執行cout語句輸出復數形式的信息。然后執行return語句。

請思考,return  output的作用是什么?回答是能連續向輸出流插入信息。output是ostream類的對象,它是實參cout的引用,也就是cout通過傳送地址給output,使它們二者共享同一段存儲單元,或者說output是cout的別名。因此,return output就是return cout,將輸出流cout的現狀返回,即保留輸出流的現狀。

請問返回到哪里?剛才是在執行

  cout<<c3;


在已知cout<<c3的返回值是cout的當前值。如果有以下輸出:

  cout<<c3<<c2;


先處理

  cout<<c3



  (cout<<c3)<<c2;


而執行(cout<<c3)得到的結果就是具有新內容的流對象cout,因此,(cout<<c3)<<c2相當于cout(新值)<<c2。運算符“<<”左側是ostream類對象cout,右側是Complex類對象c2,則再次調用運算符“<<”重載函數,接著向輸出流插入c2的數據。現在可以理解了為什么C++規定運算符“<<”重載函數的第一個參數和函數的類型都必須是ostream類型的引用,就是為了返回cout的當前值以便連續輸出。

請讀者注意區分什么情況下的“<<”是標準類型數據的流插入符,什么情況下的“<<”是重載的流插入符。如

  cout<<c3<<5<<endl;


有下劃線的是調用重載的流插入符,后面兩個“<<”不是重載的流插入符,因為它的右側不是Complex類對象而是標準類型的數據,是用預定義的流插入符處理的。

還有一點要說明,在本程序中,在Complex類中定義了運算符“<<”重載函數為友元函數,因此只有在輸出Complex類對象時才能使用重載的運算符,對其他類型的對象是無效的。如

  cout<<time1; //time1是Time類對象,不能使用用于Complex類的重載運算符


重載流提取運算符“>>”

C++預定義的運算符“>>”的作用是從一個輸入流中提取數據,如“cin>>i;”表示從輸入流中提取一個整數賦給變量i(假設已定義i為int型)。重載流提取運算符的目的是希望將“>>”用于輸入自定義類型的對象的信息。

[例] 在上例的基礎上,增加重載流提取運算符“>>”,用“cin>>”輸入復數,用“cout<<”輸出復數。

#include <iostream>using namespace std;class Complex{  public:  friend ostream& operator << (ostream&,Complex&); //聲明重載運算符“<<”  friend istream& operator >> (istream&,Complex&); //聲明重載運算符“>>”  private:  double real;  double imag;};ostream& operator << (ostream& output,Complex& c) //定義重載運算符“<<”{  output<<"("<<c.real<<"+"<<c.imag<<"i)";  return output;}istream& operator >> (istream& input,Complex& c) //定義重載運算符“>>”{  cout<<"input real part and imaginary part of complex number:";  input>>c.real>>c.imag;  return input;}int main( ){  Complex c1,c2;  cin>>c1>>c2;  cout<<"c1="<<c1<<endl;  cout<<"c2="<<c2<<endl;  return 0;}

運行情況如下:

input real part and imaginary part of complex number:3 6

主站蜘蛛池模板:
黄冈市|
呼伦贝尔市|
郧西县|
丰顺县|
西充县|
佛学|
株洲县|
从江县|
湘阴县|
浑源县|
司法|
八宿县|
金昌市|
两当县|
文水县|
北辰区|
东光县|
错那县|
青州市|
高平市|
永康市|
大石桥市|
股票|
雷波县|
抚顺县|
佛冈县|
宁强县|
右玉县|
琼中|
高碑店市|
永济市|
普格县|
武义县|
玛纳斯县|
兴隆县|
永兴县|
平远县|
宜宾县|
绵竹市|
大化|
大化|