詳解C++編程中的重載流拔出運算符和流提取運算符。本站提示廣大學習愛好者:(詳解C++編程中的重載流拔出運算符和流提取運算符)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中的重載流拔出運算符和流提取運算符正文
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↙ input real part and imaginary part of complex number:4 10↙ c1=(3+6i) c2=(4+10i)
以上運轉成果無疑是准確的,但其實不完美。在輸出單數的虛部為正值時,輸入的成果是沒有成績的,然則虛部假如是正數,就不睬想,請不雅察輸入成果。
input real part and imaginary part of complex number:3 6↙ input real part and imaginary part of complex number:4 -10↙ c1=(3+6i) c2=(4+-10i)
依據先調試經由過程,最初完美的准繩,可對法式作需要的修正。將重載運算符“<<”函數修正以下:
ostream& operator << (ostream& output,Complex& c) { output<<"("<<c.real; if(c.imag>=0) output<<"+";//虛部為負數時,在虛部前加“+”號 output<<c.imag<<"i)"<<endl; //虛部為正數時,在虛部前不加“+”號 return output; }
如許,運轉時輸入的最初一行動c2=(4-10i) 。
可以看到,在C++中,運算符重載是很主要的、很有適用意義的。它使類的設計加倍豐碩多彩,擴展了類的功效和應用規模,使法式易於懂得,易於對對象停止操作,它表現了為用戶著想、便利用戶應用的思惟。有了運算符重載,在聲清楚明了類以後,人們便可以像應用尺度類型一樣來應用本身聲明的類。類的聲明常常是與日俱增的,有了好的類,用戶在法式中就不用界說很多成員函數去完成某些運算和輸出輸入的功效,使主函數加倍簡略易讀。好的運算符重載能表現面向對象法式設計思惟。
可以看到,在運算符重載中應用援用(reference)的主要性。應用援用作為函數的形參可以在挪用函數的進程中不是用傳遞值的方法停止真假聯合,而是經由過程傳址方法使形參成為實參的別號,是以不生成暫時變量(實參的正本),削減了時光和空間的開支。另外,假如重載函數的前往值是對象的援用時,前往的不是常量,而是援用所代表的對象,它可以湧現在賦值號的左邊而成為左值(left value),可以被賦值或介入其他操作(如保存cout流確當前值以便能持續應用“<<”輸入)。但應用援用時要特殊當心,由於修正了援用就等於修正了它所代表的對象。