運(yùn)算符重載及流類庫課件_第1頁
運(yùn)算符重載及流類庫課件_第2頁
運(yùn)算符重載及流類庫課件_第3頁
運(yùn)算符重載及流類庫課件_第4頁
運(yùn)算符重載及流類庫課件_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第七章運(yùn)算符重載及流類庫運(yùn)算符重載類運(yùn)算符和友元運(yùn)算符++和--運(yùn)算符的重載流類庫運(yùn)算符“<<”和“>>”的重載格式控制文件操作方式流的錯誤處理第七章運(yùn)算符重載及流類庫運(yùn)算符重載運(yùn)算符重載對基本數(shù)據(jù)類型,“+”、“–”等,C++用一種簡潔的方式工作。例:intx,y,z;z=x+y;若有復(fù)數(shù)類complex:classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};complexc1(1.1,2.3),c2(2.2,1.3),total;total=c1+c2;運(yùn)算符重載對基本數(shù)據(jù)類型,“+”、“–”等,C++用一種運(yùn)算符重載運(yùn)算符重載通過創(chuàng)建operator()和一個(gè)運(yùn)算符連用構(gòu)成運(yùn)算符函數(shù)實(shí)現(xiàn)格式:Typeoperator@(參數(shù)表){…//(函數(shù)定義)}例:intoperator+(x,y){…}返回值type不能是void@表示要重載的運(yùn)算符,編譯時(shí)首先檢查傳遞給函數(shù)的參數(shù)類型,如果看到是自定義的類型,則執(zhí)行用戶自己的函數(shù)運(yùn)算符重載運(yùn)算符重載通過創(chuàng)建operator()和一個(gè)運(yùn)算符運(yùn)算符重載complexoperator+(complexom1,complexom2){complextemp;temp.real=om1.real+om2.real;temp.imag=om1.imag+om2.imag;returntemp;}total=c1+c2;(total=operator+(c1,c2);)運(yùn)算符重載complexoperator+(comple運(yùn)算符重載說明:只能重載C++語言中原先已有定義的運(yùn)算符不能重載:..*::?:#不能改變運(yùn)算符的操作數(shù)個(gè)數(shù)不能改變原有的優(yōu)先級x=y-a*b;不能改變原有的結(jié)合性x=a/b*c;不能改變運(yùn)算符對預(yù)定義類型數(shù)據(jù)的操作方式+:為加法運(yùn)算,無法重載而改變它對預(yù)定義類型數(shù)據(jù)的操作方式

重載運(yùn)算符時(shí)至少有一個(gè)自定義類型的數(shù)據(jù)作為操作數(shù)運(yùn)算符重載說明:類運(yùn)算符成員運(yùn)算符函數(shù)定義的語法形式:classX{…typeoperator@(參數(shù)表);…};說明:重載單目運(yùn)算符,則參數(shù)表為空;若運(yùn)算符為雙目運(yùn)算符,則參數(shù)表中有一個(gè)操作數(shù)。雙目運(yùn)算符重載:classX{…intoperator+(Xa);…};說明:參數(shù)作為運(yùn)算符的右操作數(shù)。當(dāng)前對象作為運(yùn)算符的左操作數(shù),通過this指針隱含地傳遞給函數(shù)類運(yùn)算符成員運(yùn)算符函數(shù)定義的語法形式:classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};complexoperator+(complexc){complextemp;temp.real=c.real+real;temp.imag=c.imag+imag;returntemp;}};voidmain(){complexA1(2.3,4.6),A2(3.6,2.8),A3;A3=A1+A2;(解釋為:A3=A1.operator+(A2);)}采用成員函數(shù)重載雙目運(yùn)算符后,使用的方法:aa@bb;aa.operator@(bb);類運(yùn)算符雙目運(yùn)算符classcomplex{采用成員函數(shù)重載雙目運(yùn)算符后,使類運(yùn)算符單目運(yùn)算符單目運(yùn)算符重載:參數(shù)通過this指針隱含地傳遞給函數(shù)classc{intx,y;public:c(inti=0,intj=0){x=i;y=j;}coperator++(){++x;++y;return*this;}};voidmain(){cob(10,20);++ob;ob.operator++();};采用成員函數(shù)重載單目運(yùn)算符后,使用的方法:@aa;aa.operator@();類運(yùn)算符單目運(yùn)算符單目運(yùn)算符重載:classc{采用成員函雙目運(yùn)算符可以被重載為成員函數(shù),但有一種情況:例:成員運(yùn)算符函數(shù)重載了+運(yùn)算符ob=ob+100解釋為ob.operator+(100)但:ob=100+ob;解釋為100.operator+(ob)錯誤類運(yùn)算符雙目運(yùn)算符可以被重載為成員函數(shù),但有一種情況:類運(yùn)算符友元運(yùn)算符友元運(yùn)算符函數(shù)定義的語法形式:friendtypeoperator@(參數(shù)表);說明:友元函數(shù)沒有this指針,若重載的是雙目運(yùn)算符,則參數(shù)表中有兩個(gè)操作數(shù);若重載的是單目運(yùn)算符,則參數(shù)表中有一個(gè)操作數(shù)友元運(yùn)算符友元運(yùn)算符函數(shù)定義的語法形式:友元運(yùn)算符雙目運(yùn)算符classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}friendcomplexoperator+(complexa,complexb){complextemp;temp.real=a.real+b.real;temp.imag=a.imag+b.imag;returntemp;}};voidmain(){complexA1(2.3,4.6),A2(3.6,2.8),A3;A3=A1+A2;}采用友元函數(shù)重載雙目運(yùn)算符后,使用的方法:aa@bb;operator@(aa,bb);友元運(yùn)算符雙目運(yùn)算符classcomplex{采用友元函數(shù)友元運(yùn)算符單目運(yùn)算符classc{intx,y;public:c(inti=0,intj=0){x=i;y=j;}voidshow(){cout<<x<<y;}

//operatorint(){returnx;}friendcoperator++(cop){++op.x;++op.y;

returnop;}};voidmain(){cob(10,20);ob.show();++ob;//cout<<operator++(ob);ob.show();數(shù)據(jù)成員沒有自增?采用友元函數(shù)重載單目運(yùn)算符后,使用的方法:采用引用參數(shù)傳遞操作數(shù),以改變操作數(shù)的值operator++(c&op)@aa;operator@(aa);不能用友元函數(shù)重載:=()[]->不要改變操作數(shù)時(shí),可采用傳值的方法。友元運(yùn)算符單目運(yùn)算符classc{數(shù)據(jù)成員沒有自增?不能用成員運(yùn)算符函數(shù)和友元運(yùn)算符函數(shù)的比較雙目運(yùn)算符:成員運(yùn)算符函數(shù)帶有一個(gè)參數(shù),而友元運(yùn)算符函數(shù)帶有兩個(gè)參數(shù)。單目運(yùn)算符:成員運(yùn)算符函數(shù)不帶參數(shù),而友元運(yùn)算符函數(shù)帶有一個(gè)參數(shù)成員運(yùn)算符函數(shù)和友元運(yùn)算符函數(shù)的兩種調(diào)用方式。習(xí)慣形式友元運(yùn)算符函數(shù)的調(diào)用成員運(yùn)算符函數(shù)的調(diào)用a+boperator+(a,b)a.operator+(b)-aoperator-(a)a.operator-()a++operator++(a,0)a.operator++(0)對于雙目運(yùn)算符,將它重載為一個(gè)友元運(yùn)算符函數(shù)比重載為成員運(yùn)算符函數(shù)便于使用。若運(yùn)算符的操作要修改類對象的狀態(tài),則選成員運(yùn)算符函數(shù)較好如運(yùn)算符所需的操作數(shù)(尤其是第一個(gè)操作數(shù)需)希望有隱式類型轉(zhuǎn)換,則必須用友元成員運(yùn)算符函數(shù)和友元運(yùn)算符函數(shù)的比較雙目運(yùn)算符:成員運(yùn)算符函++和--運(yùn)算符的重載對前綴方式++ob,可以用運(yùn)算符函數(shù)重載為:ob.operator++();(成員函數(shù))或operator++(X&ob);(友元函數(shù))對后綴方式ob++,可以用運(yùn)算符函數(shù)重載為:ob.operator++(int);(成員函數(shù))或operator++(X&ob,int);(友元函數(shù))調(diào)用時(shí)參數(shù)int一般被傳遞給值0++和--運(yùn)算符的重載對前綴方式++ob,可以用運(yùn)算符函數(shù)classover{inti1,i2;public:voidinit(intI1,intI2){i1=I1;i2=I2;}voidprint(){cout<<i1<<i2<<endl;}overoperator++(){++i1;++i2;return*this;}overoperator++(int){overtemp(*this);i2++;i1++;returntemp;}friendoveroperator--(over&op){--op.i1;--op.i2;returnop;}friendoveroperator--(over&op,int){overtemp;temp.i1=op.i1--;temp.i2=op.i2--;returntemp;}};voidmain(){overb1,b2,b3,b4;b1.init(4,2);b2.init(2,5);b3.init(8,3);b4.init(3,6);(++b1).print();(b2++).print();(--b3).print();(b4--).print();(b1.operator++()).print();(b2.operator++(0)).print();(operator--(b3)).print();(operator--(b4,0)).print();}classover{流類庫stdio.h中提供的printf和scanf的缺陷非類型安全:編譯系統(tǒng)對函數(shù)原型進(jìn)行檢查(參數(shù)個(gè)數(shù)、參數(shù)類型),可以避免許多錯誤,但是編譯系統(tǒng)對printf()和scanf()函數(shù)只檢查第一個(gè)參數(shù)(參數(shù)個(gè)數(shù)和類型信息包含在第一個(gè)參數(shù)中),所以,其他的錯誤無法在編譯時(shí)被發(fā)現(xiàn)。不可擴(kuò)充性:不能對類對象進(jìn)行輸入輸出C++流庫流:數(shù)據(jù)從源(數(shù)據(jù)的生產(chǎn)者)到漏(數(shù)據(jù)的消費(fèi)者)的流動。流庫:為完成輸入輸出工作而預(yù)定義的類的集合,這些類構(gòu)成一個(gè)層次結(jié)構(gòu)的系統(tǒng)輸出:將一個(gè)對象的狀態(tài)換成一個(gè)字符序列,輸出到某個(gè)地方。向“流”中添加數(shù)據(jù)

輸入:從某個(gè)地方接收到一個(gè)字符序列,將其轉(zhuǎn)換成一個(gè)對象的狀態(tài)所要求的格式。從“流”中獲取數(shù)據(jù)

流類庫stdio.h中提供的printf和scanf的缺陷流類庫流類庫的基類:streambuf和ios類,所有的流類都是從它們直接或間接派生出的streambuf類:負(fù)責(zé)緩沖區(qū)的處理。緩沖區(qū)由一個(gè)字符序列和兩個(gè)指針組成,指針分別指向字符將被插入或被取出的位置。streambuffilebufstrstreambufconbuffilebuf:能夠處理文件。把filebuf同某個(gè)文件的描述字相聯(lián)系稱為打開該文件。strstreambuf:提供了在內(nèi)存中進(jìn)行提取和插入操作的緩沖區(qū)管理。conbuf:能處理輸出,為輸出操作提供緩沖區(qū)管理。流類庫流類庫的基類:streambuf和ios類,所有的流類流類庫ios類:提供了使用流類的接口,都有一個(gè)指向streambuf的指針。ios是一個(gè)虛基類,定義了用于格式化輸入輸出及出錯處理的成員函數(shù)。iosistreamostreamiostreamios類派生出4個(gè)類:輸入流(istream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運(yùn)算符“>>”,該類提供了流的大部分輸入操作輸出流(ostream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運(yùn)算符“<<”,該類提供了流的主要輸出操作:文件流(fstreambase):提供了文件流的公共操作串流(strstreambase):專門處理串流流類庫ios類:提供了使用流類的接口,都有一個(gè)指向strea流類庫4種基本流類組合派生出實(shí)用流:輸入/輸出流(iostream):輸入/輸出文件流(fstream):輸入/輸出串流(strstream):屏幕輸出流(constream):輸入文件流(ifstream):輸出文件流(ofstream):輸入串流(istrstream):輸出串流(ostrstream):例:iostream是通過多重繼承從輸入流類istream和輸出流類ostream派生而來的。支持雙向操作。classios;classistream:virtualpublicios;classostream:virtualpublicios;classiostream:publicistream,publicostream;流類庫4種基本流類組合派生出實(shí)用流:在istream、ostream、iostream類的基礎(chǔ)上重載“=”,產(chǎn)生istream_withassign、ostream_withassign和 iostream_withassign流類庫在istream、ostream、iostream類的基礎(chǔ)上流類庫執(zhí)行C++程序時(shí),系統(tǒng)自動打開幾個(gè)預(yù)定義流,用戶在程序中直接使用iostream.h:標(biāo)準(zhǔn)I/O流頭文件,在該文件中對各個(gè)流類定義了各自的全局對象。

cin:是istream_withassign類的對象,稱為標(biāo)準(zhǔn)輸入流,缺省為鍵盤cout:是ostream_withassign類的對象,稱為標(biāo)準(zhǔn)輸出流,缺省為顯示器cerr和clog:是ostream_withassign類的對象,稱為標(biāo)準(zhǔn)錯誤輸出流,固定關(guān)聯(lián)到顯示器。cerr沒有被緩沖,因而發(fā)送給它的任何內(nèi)容都立即輸出;相反clog被緩沖了,只有當(dāng)緩沖區(qū)滿時(shí)才輸出流類庫執(zhí)行C++程序時(shí),系統(tǒng)自動打開幾個(gè)預(yù)定義流,用戶在程序例:要為用戶計(jì)算平均價(jià)格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)為零),下面的代碼能檢測用戶所輸入的數(shù)值并顯示出相應(yīng)的錯誤信息。cout<<“Howmanyunitsdidyousell?”;cin>>num;if(num==0){cerr<<“Theaveragecannotbecomputer.\n”);}else{…}例:要為用戶計(jì)算平均價(jià)格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)預(yù)定義類型的輸入輸出輸入運(yùn)算符>>:雙目運(yùn)算符,有兩個(gè)操作數(shù),左操作數(shù)是istream類的一個(gè)對象,右操作數(shù)既可以是一個(gè)預(yù)定義類型的變量,也可以是重載了該運(yùn)算符的類對象缺省時(shí):>>運(yùn)算符跳過空白符,然后讀入與輸入變量類型相對應(yīng)的值。因此,給一組變量輸入值時(shí)可用空格或換行把鍵入的數(shù)值間隔開。intn;floatx;cin>>n>>x;當(dāng)輸入字符串時(shí):>>運(yùn)算符跳過空白符,讀入以下的非空白字符,直到遇到另一個(gè)空白字符為止,并在串尾放一個(gè)字符\0。char*str;cin>>str;輸入:objectprogramming!則:str=“object”預(yù)定義類型的輸入輸出輸入運(yùn)算符>>:雙目運(yùn)算符,有兩個(gè)操作數(shù)預(yù)定義類型的輸入輸出不同類型的變量一起輸入時(shí),系統(tǒng)除檢查是否含有空白符外,還完成輸入數(shù)據(jù)與變量類型的匹配intn;floatx;cin>>n>>x;輸入:35.7889.25則:n=35x=.78輸入運(yùn)算符>>采用左結(jié)合方式工作,并返回它的左操作數(shù)。預(yù)定義類型的輸入輸出不同類型的變量一起輸入時(shí),系統(tǒng)除檢查是否預(yù)定義類型的輸入輸出輸出運(yùn)算符:雙目運(yùn)算符,有兩個(gè)操作數(shù),左操作數(shù)是ostream類的對象,右操作數(shù)既可以是一個(gè)預(yù)定義類型的變量,也可以是重載了該運(yùn)算符的類對象<<運(yùn)算符:采用左結(jié)合方式工作,并且返回它的左操作數(shù)。使用<<進(jìn)行輸出操作時(shí),編譯程序根據(jù)出現(xiàn)在運(yùn)算符右邊的變量的類型決定調(diào)用重載該運(yùn)算符的哪個(gè)版本重載不能改變運(yùn)算符的優(yōu)先級cout<<x&y<<‘\n’;預(yù)定義類型的輸入輸出輸出運(yùn)算符:雙目運(yùn)算符,有兩個(gè)操作數(shù),左運(yùn)算符<<和>>的重載<<:重載格式為ostream&operator<<(ostream&stream,CLASSAa){對于類CLASSA的輸出操作returnstream;}說明:假設(shè)定義為成員函數(shù)則左運(yùn)算數(shù)應(yīng)當(dāng)是調(diào)用運(yùn)算符函數(shù)的類的對象,但重載時(shí)左操作數(shù)是流第一個(gè)參數(shù)為ostream類的一個(gè)引用第二個(gè)參數(shù)為自定義的類類型的對象返回第一個(gè)參數(shù),使<<能連續(xù)使用例:cout<<a<<b;operator<<(cout,a)運(yùn)算符<<和>>的重載<<:重載格式為為復(fù)數(shù)類型重載<<#include<iostream.h>classcomplex{private:floatRe,Im;public:complex(floatr=0,floati=0){Re=r;Im=i;}

friendostream&operator<<(ostream&s,complexc){s<<c.Re<<“+”;s<<c.Im<<“i”<<endl;returns;}};voidmain(){complexa(3,4),b(5,6);cout<<a<<b;}

為復(fù)數(shù)類型重載<<#include<iostream.h>為復(fù)數(shù)類型重載>>#include<iostream.h>classcomplex{private:floatRe,Im;public:complex(floatr=0,floati=0){Re=r;Im=i;}

friendistream&operator>>(istream&s,complexc){s>>c.Re>>c.Im;returns;}};voidmain(){complexa(3,4),b(5,6);cin>>a>>b;}

輸入1234(注意不能輸入1,2,3,4逗號不是間隔)a=?為復(fù)數(shù)類型重載>>#include<iostream.h>運(yùn)算符<<和>>的重載istream&operator>>(istream&in,user_type&obj){…returnin;}注意:返回類型是類對象的引用,把幾個(gè)輸入運(yùn)算符放在同一條語句中時(shí),該重載函數(shù)仍能正確工作。第二個(gè)參數(shù)為引用,因?yàn)橐薷膶?shí)參假設(shè)定義為成員函數(shù)則cin>>d;解釋為:cin.operator>>(d);相當(dāng)于為istream類重載輸入運(yùn)算符運(yùn)算符<<和>>的重載istream&operator>>格式控制格式控制方法:使用ios類中有關(guān)格式控制的成員函數(shù)使用稱為控制符的特殊類型函數(shù)用ios類成員函數(shù)控制格式在ios類中說明了數(shù)據(jù)成員longx_flags,存放控制輸入輸出格式的狀態(tài)標(biāo)志,每個(gè)狀態(tài)標(biāo)志占一位。詳見p138設(shè)定了某個(gè)狀態(tài)標(biāo)志,則x_flags中對應(yīng)位為1,否則為0,可以幾個(gè)標(biāo)志并存例:對于12.0,如未置showpoint位,則輸出12,若置此位,輸出12.000000格式控制格式控制方法:格式控制用成員函數(shù)操作狀態(tài)標(biāo)志設(shè)置狀態(tài)標(biāo)志setf原型:longios::setf(longflags);使用:stream_obj.setf(ios::scientific);其中:stream_obj多為cin、cout設(shè)置多個(gè)標(biāo)志時(shí),彼此用或運(yùn)算符|分隔例:cout.setf(ios::dec|ios::scientific);清除狀態(tài)標(biāo)志unsetf原型:longios::unsetf(longflags);作用:把指定的狀態(tài)標(biāo)志位置0,即清除指定的狀態(tài)標(biāo)志取狀態(tài)標(biāo)志flags原型:longios::flags();longios::flags(longflags);作用:取狀態(tài)標(biāo)志格式控制用成員函數(shù)操作狀態(tài)標(biāo)志設(shè)置狀態(tài)標(biāo)志setf原型:lo操作狀態(tài)標(biāo)志的成員函數(shù)舉例#include<iostream.h>voidshowflags(longf){longi;for(i=0x8000;i;i=i>>1)if(i&f)cout<<“1”;elsecout<<“0”;cout<<“\n”;}voidmain(){longf;

f=cout.flags();showflags(f);

cout.setf(ios::showpos|ios::scientific);f=cout.flags();

showflags(f);

cout.unsetf(ios::scientific);f=cout.flags();showflags(f);}操作狀態(tài)標(biāo)志的成員函數(shù)舉例#include<iostrea格式控制設(shè)置域?qū)捲停篿ntios::width();返回當(dāng)前的域?qū)捴礽ntios::width(intwid);設(shè)置域?qū)?,并返回原域?qū)捥攸c(diǎn):設(shè)置的域?qū)拑H對下一個(gè)流輸出操作有效,當(dāng)一次輸出操作完成后,域?qū)捇謴?fù)為0設(shè)置填充字符:當(dāng)輸出值不足以填滿域?qū)挄r(shí)用該字符來填充原型:charios::fill();返回當(dāng)前的填充字符charios::fill(charc)用參數(shù)c重新設(shè)置填充字符, 并返回填充前的字符設(shè)置顯示精度原型:intios::precision();返回當(dāng)前的顯示精度intios::precision(intnum)用參數(shù)num重新設(shè)置顯 示精度,并返回設(shè)置前的顯示精度格式控制設(shè)置域?qū)捲停篿ntios::width();返回上述成員函數(shù)舉例#include<iostream.h>voidmain(){cout<<“defaultwidthis”<<cout.width()<<“\n”;cout<<“defaultfillis”<<cout.fill()<<“\n”;cout<<“defaultprecisionis”<<cout.precision()<<“\n”;cout<<666<<““<<123.45678<<“\n”;

cout.precision(3);cout.width(8);cout<<666<<““<<123.45678<<““<<456.78<<“\n”;cout<<“currentwidthis”<<cout.width()<<“\n”;cout<<“currentprecisionis”<<cout.precision()<<“\n”;

cout<<fill(‘*’);cout.width(8);cout<<666<<““<<123.45678<<“\n”;}defaultwidthis0defaultfillisdefaultprecisionis6666123.457666123457currentwidthis0currentprecisionis3*****666123上述成員函數(shù)舉例#include<iostream.h>格式控制結(jié)論:缺省域?qū)挒?;缺省的填充字符為空格;缺省的輸出精度為0,即按數(shù)據(jù)的實(shí)際精度輸出設(shè)置了顯示精度后,若數(shù)據(jù)的實(shí)際精度與設(shè)置的精度不一致,則輸出方法如下:實(shí)際精度大于設(shè)置精度時(shí),四舍五入后按設(shè)置的精度輸出;實(shí)際精度小于設(shè)置的精度時(shí),按實(shí)際精度輸出設(shè)置域?qū)捄?,只對其后最接近它的第一個(gè)輸出有影響,第一個(gè)輸出完成后系統(tǒng)立即把域?qū)捴?格式控制結(jié)論:用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時(shí),必須由流對象來調(diào)用它們,且不能把它們直接嵌入到輸入輸出語句中??刂品侯愃朴诤瘮?shù)的運(yùn)算符。用一個(gè)流引用作為參數(shù),并返回同一個(gè)流的引用標(biāo)準(zhǔn)控制符:dec:設(shè)置十進(jìn)制轉(zhuǎn)換基格式標(biāo)志hex:設(shè)置十六進(jìn)制轉(zhuǎn)換基格式標(biāo)志oct:設(shè)置八進(jìn)制轉(zhuǎn)換基格式標(biāo)志ws:提取空白字符,僅用于輸入endl:插入換行符并刷新流,僅用于輸出ends:在串后插入終止空字符,僅用于輸出flush:刷新輸出流,僅用于輸出setbase(intn):設(shè)置轉(zhuǎn)換基格式位n(取值0,8,16,10),缺省為0用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時(shí),必須由用控制符控制格式sesetiosflags(longf):清除由參數(shù)f指定的格式位,用于輸入輸出setfill(intc):設(shè)置填充字符,對于右對齊輸出,填充左面;對于左對齊輸出填充右面。一次設(shè)置多次有效。用于輸入輸出setprecision(intn):設(shè)置浮點(diǎn)數(shù)精度為n,用于輸入輸出setw(intn):設(shè)置域?qū)挒閚,只對下一次的輸出操作有效。用于輸入輸出上述控制符在iostream.h中定義,控制符函數(shù)在iomanip.h中定義,使用控制符函數(shù)時(shí)必須包含這兩個(gè)頭文件用控制符控制格式sesetiosflags(longf):控制符和控制符函數(shù)舉例#include<iostream.h>#include<iomanip.h>voidmain(){cout<<123<<setw(5)<<456<<88<<“\n”;cout<<123<<setw(5)<<setfill(‘*’)<<456<<setw(5)<<88<<“\n”;}12345688123**456***88控制符和控制符函數(shù)舉例#include<iostream.控制符和控制符函數(shù)舉例#include<iostream.h>#include<iomanip.h>voidmain(){floatv1=1360.53;floatv2=300.23;floatv3=84430.23;cout<<setiosflags(ios::showpoint|ios::fixed)<<setprecision(2)<<setfill(‘*’)<<setiosflags(ios::right);cout<<“\nCheckValue:$“<<setw(10)<<v1;cout<<“\nCheckValue:$“<<setw(10)<<v2;cout<<“\nCheckValue:$“<<setw(10)<<v3;}CheckValue:$***1360.53CheckValue:$****300.23CheckValue:$**84430.23控制符和控制符函數(shù)舉例#include<iostream.用戶自定義控制符用途:當(dāng)要對預(yù)先未定義的設(shè)備進(jìn)行操作時(shí),定義自己的控制函數(shù)能使得對這類設(shè)備的操作變得方便當(dāng)多次重復(fù)使用幾個(gè)相同的控制符時(shí),可以把這些控制符合并在一個(gè)控制函數(shù)中,以便于用戶使用為輸出流定義控制函數(shù)的格式為:ostream&manip_name(ostream&str){…returnstr;}為輸入流定義控制函數(shù)的格式為:istream&manip_name(istream&str){…returnstr;}調(diào)用時(shí)只要直接寫出自定義控制符的名字:manip_name用戶自定義控制符用途:用戶自定義控制符#include<iostream.h>#include<iomanip.h>ostream&setout(ostream&stream){stream.setf(ios::left);stream<<setw(8)<<setfill(‘*’);returnstream;}voidmain(){cout<<“firstline:”<<setout<<25<<“\n”;cout<<“secondline:”<<setout<<148<<“\n”;}firstline:25******secondline:148*****用戶自定義控制符#include<iostream.h>f文件操作方式文件:C++把文件當(dāng)成字符序列。按照數(shù)據(jù)的組織形式,可把文件分成ASCII文件和二進(jìn)制文件ASCII文件:每個(gè)字節(jié)放一個(gè)ASCII代碼,表示一個(gè)字符,使用方便但占用的存儲空間較多。缺省時(shí)文件以正文方式打開,即在輸入時(shí)回車/換行序列轉(zhuǎn)換成字符‘\n’,輸出時(shí)字符‘\n’轉(zhuǎn)換成回車/換行序列二進(jìn)制文件:把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣寫到外存儲器中。二進(jìn)制文件可以節(jié)省外存空間,但它的一個(gè)字節(jié)不對應(yīng)一個(gè)字符打開文件:進(jìn)行文件的輸入輸出,首先建立一個(gè)文件流,把該流和實(shí)際的文件相關(guān)聯(lián)關(guān)閉文件:取消文件和流的關(guān)聯(lián)文件流:輸入文件流、輸出文件流、輸入/輸出文件流文件操作方式文件:C++把文件當(dāng)成字符序列。按照數(shù)據(jù)的組織形面向文件的流類fstream.h:“文件流”頭文件,在該文件中對各個(gè)文件流類進(jìn)行了定義,但是沒有預(yù)定義各自的全局對象。因?yàn)?,在C++中文件類不是標(biāo)準(zhǔn)設(shè)備,不能預(yù)先定義。在頭文件fstream.h中給出了fstreambase、ifstream、ofstream、fstream類的定義。fstreambase是ifstream和ofstream的公共基類,fstream是ifstream和ofstream的派生類,都是公有繼承關(guān)系執(zhí)行文件輸入輸出前的三件事:在程序中包含頭文件fstream.h建立文件流,即說明面向文件流類的對象打開文件,即是使某個(gè)文件和某以文件流相關(guān)聯(lián)。(文件名和文件的打開方式是傳遞給構(gòu)造函數(shù)的實(shí)參)

面向文件的流類fstream.h:“文件流”頭文件,在該文件創(chuàng)建文件流時(shí),需要使用面向文件的流類的構(gòu)造函數(shù)。每個(gè)面向文件的流類都有四個(gè)重載的構(gòu)造函數(shù)?fstream():創(chuàng)建一個(gè)未打開的文件流?fstream(constchar*,intmode,intprot=filebuf::openprot):創(chuàng)建一個(gè)打開的文件流第一個(gè)參數(shù)指定與此文件流相關(guān)聯(lián)的文件的名字第二個(gè)參數(shù)mode決定文件的打開方式app:追加數(shù)據(jù) ate:文件指針移到文件尾in:以輸入方式打開文件 out:以輸出方式打開文件binary:二進(jìn)制方式打開文件trunc:文件存在清除原有內(nèi)容nocreate:文件不存在失敗 noreplace:文件存在失敗第三個(gè)參數(shù)決定文件的保護(hù)方式:0普通文件;1只讀文件;2隱含文件;4系統(tǒng)文件;8備份文件面向文件的流類創(chuàng)建文件流時(shí),需要使用面向文件的流類的構(gòu)造函數(shù)。每個(gè)面向文件面向文件的流類創(chuàng)建ifstream類對象時(shí),缺省的mode值為ios::in;創(chuàng)建ofstream類對象時(shí),缺省的mode值為ios::out;未顯式指明以二進(jìn)制方式打開文件,則缺省的方式為文本方式;?fstream(intfd):創(chuàng)建一個(gè)打開的文件流,并把它鏈接到文件柄為fd的文件?fstream(intfd,char*buf,intlen):創(chuàng)建一個(gè)打開的文件流,并把它鏈接到文件柄為fd的文件close函數(shù):關(guān)閉與該流對象相鏈接的文件,并清除流的錯誤狀態(tài)open(constchar*name,intmode,intprot=filebuf::openprot)函數(shù):打開名為name的文件例:建立一個(gè)輸入輸出文件流both,把它鏈接到文件data.dat上,并清除原有的文件內(nèi)容fstreamboth;both.open(“data.dat”,ios::in|ios::out|ios::trunc);fstreamboth(“data.dat”,”ios::in|ios::out|ios::trunc);面向文件的流類創(chuàng)建ifstream類對象時(shí),缺省的mode值文件的讀寫文本文件文本文件的讀寫:使用輸入運(yùn)算符和輸出運(yùn)算符例:把一個(gè)整數(shù)、浮點(diǎn)數(shù)、字符串寫到文件data中#include<iostream.h>#include<fstream.h>main(){ofstreamout(“data”);if(!out){cout<<“cannotopenfiledata.”;return0;}out<<256<<““<<198.69<<““<<“C++Language\n”;out.close();return1;}文件的讀寫文本文件文本文件的讀寫:使用輸入運(yùn)算符和輸出運(yùn)算符文件的讀寫二進(jìn)制二進(jìn)制文件的讀寫:使用istream類的公有成員函數(shù)get(char&)和ostream類的公有成員函數(shù)put(char)例:在屏幕上顯示任何文件的內(nèi)容#include<iostream.h>#include<fstream.h>main(intargc,char*argv[]){charch;ifstreamin(argv[1]);if(!in){cout<<“Cannotopenfile”;return1;}while(!in.eof()){in.get(ch);cout<<ch;}return0;}文件的讀寫二進(jìn)制二進(jìn)制文件的讀寫:使用istream類的公有流的錯誤處理流的錯誤處理第七章運(yùn)算符重載及流類庫運(yùn)算符重載類運(yùn)算符和友元運(yùn)算符++和--運(yùn)算符的重載流類庫運(yùn)算符“<<”和“>>”的重載格式控制文件操作方式流的錯誤處理第七章運(yùn)算符重載及流類庫運(yùn)算符重載運(yùn)算符重載對基本數(shù)據(jù)類型,“+”、“–”等,C++用一種簡潔的方式工作。例:intx,y,z;z=x+y;若有復(fù)數(shù)類complex:classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};complexc1(1.1,2.3),c2(2.2,1.3),total;total=c1+c2;運(yùn)算符重載對基本數(shù)據(jù)類型,“+”、“–”等,C++用一種運(yùn)算符重載運(yùn)算符重載通過創(chuàng)建operator()和一個(gè)運(yùn)算符連用構(gòu)成運(yùn)算符函數(shù)實(shí)現(xiàn)格式:Typeoperator@(參數(shù)表){…//(函數(shù)定義)}例:intoperator+(x,y){…}返回值type不能是void@表示要重載的運(yùn)算符,編譯時(shí)首先檢查傳遞給函數(shù)的參數(shù)類型,如果看到是自定義的類型,則執(zhí)行用戶自己的函數(shù)運(yùn)算符重載運(yùn)算符重載通過創(chuàng)建operator()和一個(gè)運(yùn)算符運(yùn)算符重載complexoperator+(complexom1,complexom2){complextemp;temp.real=om1.real+om2.real;temp.imag=om1.imag+om2.imag;returntemp;}total=c1+c2;(total=operator+(c1,c2);)運(yùn)算符重載complexoperator+(comple運(yùn)算符重載說明:只能重載C++語言中原先已有定義的運(yùn)算符不能重載:..*::?:#不能改變運(yùn)算符的操作數(shù)個(gè)數(shù)不能改變原有的優(yōu)先級x=y-a*b;不能改變原有的結(jié)合性x=a/b*c;不能改變運(yùn)算符對預(yù)定義類型數(shù)據(jù)的操作方式+:為加法運(yùn)算,無法重載而改變它對預(yù)定義類型數(shù)據(jù)的操作方式

重載運(yùn)算符時(shí)至少有一個(gè)自定義類型的數(shù)據(jù)作為操作數(shù)運(yùn)算符重載說明:類運(yùn)算符成員運(yùn)算符函數(shù)定義的語法形式:classX{…typeoperator@(參數(shù)表);…};說明:重載單目運(yùn)算符,則參數(shù)表為空;若運(yùn)算符為雙目運(yùn)算符,則參數(shù)表中有一個(gè)操作數(shù)。雙目運(yùn)算符重載:classX{…intoperator+(Xa);…};說明:參數(shù)作為運(yùn)算符的右操作數(shù)。當(dāng)前對象作為運(yùn)算符的左操作數(shù),通過this指針隱含地傳遞給函數(shù)類運(yùn)算符成員運(yùn)算符函數(shù)定義的語法形式:classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};complexoperator+(complexc){complextemp;temp.real=c.real+real;temp.imag=c.imag+imag;returntemp;}};voidmain(){complexA1(2.3,4.6),A2(3.6,2.8),A3;A3=A1+A2;(解釋為:A3=A1.operator+(A2);)}采用成員函數(shù)重載雙目運(yùn)算符后,使用的方法:aa@bb;aa.operator@(bb);類運(yùn)算符雙目運(yùn)算符classcomplex{采用成員函數(shù)重載雙目運(yùn)算符后,使類運(yùn)算符單目運(yùn)算符單目運(yùn)算符重載:參數(shù)通過this指針隱含地傳遞給函數(shù)classc{intx,y;public:c(inti=0,intj=0){x=i;y=j;}coperator++(){++x;++y;return*this;}};voidmain(){cob(10,20);++ob;ob.operator++();};采用成員函數(shù)重載單目運(yùn)算符后,使用的方法:@aa;aa.operator@();類運(yùn)算符單目運(yùn)算符單目運(yùn)算符重載:classc{采用成員函雙目運(yùn)算符可以被重載為成員函數(shù),但有一種情況:例:成員運(yùn)算符函數(shù)重載了+運(yùn)算符ob=ob+100解釋為ob.operator+(100)但:ob=100+ob;解釋為100.operator+(ob)錯誤類運(yùn)算符雙目運(yùn)算符可以被重載為成員函數(shù),但有一種情況:類運(yùn)算符友元運(yùn)算符友元運(yùn)算符函數(shù)定義的語法形式:friendtypeoperator@(參數(shù)表);說明:友元函數(shù)沒有this指針,若重載的是雙目運(yùn)算符,則參數(shù)表中有兩個(gè)操作數(shù);若重載的是單目運(yùn)算符,則參數(shù)表中有一個(gè)操作數(shù)友元運(yùn)算符友元運(yùn)算符函數(shù)定義的語法形式:友元運(yùn)算符雙目運(yùn)算符classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}friendcomplexoperator+(complexa,complexb){complextemp;temp.real=a.real+b.real;temp.imag=a.imag+b.imag;returntemp;}};voidmain(){complexA1(2.3,4.6),A2(3.6,2.8),A3;A3=A1+A2;}采用友元函數(shù)重載雙目運(yùn)算符后,使用的方法:aa@bb;operator@(aa,bb);友元運(yùn)算符雙目運(yùn)算符classcomplex{采用友元函數(shù)友元運(yùn)算符單目運(yùn)算符classc{intx,y;public:c(inti=0,intj=0){x=i;y=j;}voidshow(){cout<<x<<y;}

//operatorint(){returnx;}friendcoperator++(cop){++op.x;++op.y;

returnop;}};voidmain(){cob(10,20);ob.show();++ob;//cout<<operator++(ob);ob.show();數(shù)據(jù)成員沒有自增?采用友元函數(shù)重載單目運(yùn)算符后,使用的方法:采用引用參數(shù)傳遞操作數(shù),以改變操作數(shù)的值operator++(c&op)@aa;operator@(aa);不能用友元函數(shù)重載:=()[]->不要改變操作數(shù)時(shí),可采用傳值的方法。友元運(yùn)算符單目運(yùn)算符classc{數(shù)據(jù)成員沒有自增?不能用成員運(yùn)算符函數(shù)和友元運(yùn)算符函數(shù)的比較雙目運(yùn)算符:成員運(yùn)算符函數(shù)帶有一個(gè)參數(shù),而友元運(yùn)算符函數(shù)帶有兩個(gè)參數(shù)。單目運(yùn)算符:成員運(yùn)算符函數(shù)不帶參數(shù),而友元運(yùn)算符函數(shù)帶有一個(gè)參數(shù)成員運(yùn)算符函數(shù)和友元運(yùn)算符函數(shù)的兩種調(diào)用方式。習(xí)慣形式友元運(yùn)算符函數(shù)的調(diào)用成員運(yùn)算符函數(shù)的調(diào)用a+boperator+(a,b)a.operator+(b)-aoperator-(a)a.operator-()a++operator++(a,0)a.operator++(0)對于雙目運(yùn)算符,將它重載為一個(gè)友元運(yùn)算符函數(shù)比重載為成員運(yùn)算符函數(shù)便于使用。若運(yùn)算符的操作要修改類對象的狀態(tài),則選成員運(yùn)算符函數(shù)較好如運(yùn)算符所需的操作數(shù)(尤其是第一個(gè)操作數(shù)需)希望有隱式類型轉(zhuǎn)換,則必須用友元成員運(yùn)算符函數(shù)和友元運(yùn)算符函數(shù)的比較雙目運(yùn)算符:成員運(yùn)算符函++和--運(yùn)算符的重載對前綴方式++ob,可以用運(yùn)算符函數(shù)重載為:ob.operator++();(成員函數(shù))或operator++(X&ob);(友元函數(shù))對后綴方式ob++,可以用運(yùn)算符函數(shù)重載為:ob.operator++(int);(成員函數(shù))或operator++(X&ob,int);(友元函數(shù))調(diào)用時(shí)參數(shù)int一般被傳遞給值0++和--運(yùn)算符的重載對前綴方式++ob,可以用運(yùn)算符函數(shù)classover{inti1,i2;public:voidinit(intI1,intI2){i1=I1;i2=I2;}voidprint(){cout<<i1<<i2<<endl;}overoperator++(){++i1;++i2;return*this;}overoperator++(int){overtemp(*this);i2++;i1++;returntemp;}friendoveroperator--(over&op){--op.i1;--op.i2;returnop;}friendoveroperator--(over&op,int){overtemp;temp.i1=op.i1--;temp.i2=op.i2--;returntemp;}};voidmain(){overb1,b2,b3,b4;b1.init(4,2);b2.init(2,5);b3.init(8,3);b4.init(3,6);(++b1).print();(b2++).print();(--b3).print();(b4--).print();(b1.operator++()).print();(b2.operator++(0)).print();(operator--(b3)).print();(operator--(b4,0)).print();}classover{流類庫stdio.h中提供的printf和scanf的缺陷非類型安全:編譯系統(tǒng)對函數(shù)原型進(jìn)行檢查(參數(shù)個(gè)數(shù)、參數(shù)類型),可以避免許多錯誤,但是編譯系統(tǒng)對printf()和scanf()函數(shù)只檢查第一個(gè)參數(shù)(參數(shù)個(gè)數(shù)和類型信息包含在第一個(gè)參數(shù)中),所以,其他的錯誤無法在編譯時(shí)被發(fā)現(xiàn)。不可擴(kuò)充性:不能對類對象進(jìn)行輸入輸出C++流庫流:數(shù)據(jù)從源(數(shù)據(jù)的生產(chǎn)者)到漏(數(shù)據(jù)的消費(fèi)者)的流動。流庫:為完成輸入輸出工作而預(yù)定義的類的集合,這些類構(gòu)成一個(gè)層次結(jié)構(gòu)的系統(tǒng)輸出:將一個(gè)對象的狀態(tài)換成一個(gè)字符序列,輸出到某個(gè)地方。向“流”中添加數(shù)據(jù)

輸入:從某個(gè)地方接收到一個(gè)字符序列,將其轉(zhuǎn)換成一個(gè)對象的狀態(tài)所要求的格式。從“流”中獲取數(shù)據(jù)

流類庫stdio.h中提供的printf和scanf的缺陷流類庫流類庫的基類:streambuf和ios類,所有的流類都是從它們直接或間接派生出的streambuf類:負(fù)責(zé)緩沖區(qū)的處理。緩沖區(qū)由一個(gè)字符序列和兩個(gè)指針組成,指針分別指向字符將被插入或被取出的位置。streambuffilebufstrstreambufconbuffilebuf:能夠處理文件。把filebuf同某個(gè)文件的描述字相聯(lián)系稱為打開該文件。strstreambuf:提供了在內(nèi)存中進(jìn)行提取和插入操作的緩沖區(qū)管理。conbuf:能處理輸出,為輸出操作提供緩沖區(qū)管理。流類庫流類庫的基類:streambuf和ios類,所有的流類流類庫ios類:提供了使用流類的接口,都有一個(gè)指向streambuf的指針。ios是一個(gè)虛基類,定義了用于格式化輸入輸出及出錯處理的成員函數(shù)。iosistreamostreamiostreamios類派生出4個(gè)類:輸入流(istream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運(yùn)算符“>>”,該類提供了流的大部分輸入操作輸出流(ostream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運(yùn)算符“<<”,該類提供了流的主要輸出操作:文件流(fstreambase):提供了文件流的公共操作串流(strstreambase):專門處理串流流類庫ios類:提供了使用流類的接口,都有一個(gè)指向strea流類庫4種基本流類組合派生出實(shí)用流:輸入/輸出流(iostream):輸入/輸出文件流(fstream):輸入/輸出串流(strstream):屏幕輸出流(constream):輸入文件流(ifstream):輸出文件流(ofstream):輸入串流(istrstream):輸出串流(ostrstream):例:iostream是通過多重繼承從輸入流類istream和輸出流類ostream派生而來的。支持雙向操作。classios;classistream:virtualpublicios;classostream:virtualpublicios;classiostream:publicistream,publicostream;流類庫4種基本流類組合派生出實(shí)用流:在istream、ostream、iostream類的基礎(chǔ)上重載“=”,產(chǎn)生istream_withassign、ostream_withassign和 iostream_withassign流類庫在istream、ostream、iostream類的基礎(chǔ)上流類庫執(zhí)行C++程序時(shí),系統(tǒng)自動打開幾個(gè)預(yù)定義流,用戶在程序中直接使用iostream.h:標(biāo)準(zhǔn)I/O流頭文件,在該文件中對各個(gè)流類定義了各自的全局對象。

cin:是istream_withassign類的對象,稱為標(biāo)準(zhǔn)輸入流,缺省為鍵盤cout:是ostream_withassign類的對象,稱為標(biāo)準(zhǔn)輸出流,缺省為顯示器cerr和clog:是ostream_withassign類的對象,稱為標(biāo)準(zhǔn)錯誤輸出流,固定關(guān)聯(lián)到顯示器。cerr沒有被緩沖,因而發(fā)送給它的任何內(nèi)容都立即輸出;相反clog被緩沖了,只有當(dāng)緩沖區(qū)滿時(shí)才輸出流類庫執(zhí)行C++程序時(shí),系統(tǒng)自動打開幾個(gè)預(yù)定義流,用戶在程序例:要為用戶計(jì)算平均價(jià)格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)為零),下面的代碼能檢測用戶所輸入的數(shù)值并顯示出相應(yīng)的錯誤信息。cout<<“Howmanyunitsdidyousell?”;cin>>num;if(num==0){cerr<<“Theaveragecannotbecomputer.\n”);}else{…}例:要為用戶計(jì)算平均價(jià)格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)預(yù)定義類型的輸入輸出輸入運(yùn)算符>>:雙目運(yùn)算符,有兩個(gè)操作數(shù),左操作數(shù)是istream類的一個(gè)對象,右操作數(shù)既可以是一個(gè)預(yù)定義類型的變量,也可以是重載了該運(yùn)算符的類對象缺省時(shí):>>運(yùn)算符跳過空白符,然后讀入與輸入變量類型相對應(yīng)的值。因此,給一組變量輸入值時(shí)可用空格或換行把鍵入的數(shù)值間隔開。intn;floatx;cin>>n>>x;當(dāng)輸入字符串時(shí):>>運(yùn)算符跳過空白符,讀入以下的非空白字符,直到遇到另一個(gè)空白字符為止,并在串尾放一個(gè)字符\0。char*str;cin>>str;輸入:objectprogramming!則:str=“object”預(yù)定義類型的輸入輸出輸入運(yùn)算符>>:雙目運(yùn)算符,有兩個(gè)操作數(shù)預(yù)定義類型的輸入輸出不同類型的變量一起輸入時(shí),系統(tǒng)除檢查是否含有空白符外,還完成輸入數(shù)據(jù)與變量類型的匹配intn;floatx;cin>>n>>x;輸入:35.7889.25則:n=35x=.78輸入運(yùn)算符>>采用左結(jié)合方式工作,并返回它的左操作數(shù)。預(yù)定義類型的輸入輸出不同類型的變量一起輸入時(shí),系統(tǒng)除檢查是否預(yù)定義類型的輸入輸出輸出運(yùn)算符:雙目運(yùn)算符,有兩個(gè)操作數(shù),左操作數(shù)是ostream類的對象,右操作數(shù)既可以是一個(gè)預(yù)定義類型的變量,也可以是重載了該運(yùn)算符的類對象<<運(yùn)算符:采用左結(jié)合方式工作,并且返回它的左操作數(shù)。使用<<進(jìn)行輸出操作時(shí),編譯程序根據(jù)出現(xiàn)在運(yùn)算符右邊的變量的類型決定調(diào)用重載該運(yùn)算符的哪個(gè)版本重載不能改變運(yùn)算符的優(yōu)先級cout<<x&y<<‘\n’;預(yù)定義類型的輸入輸出輸出運(yùn)算符:雙目運(yùn)算符,有兩個(gè)操作數(shù),左運(yùn)算符<<和>>的重載<<:重載格式為ostream&operator<<(ostream&stream,CLASSAa){對于類CLASSA的輸出操作returnstream;}說明:假設(shè)定義為成員函數(shù)則左運(yùn)算數(shù)應(yīng)當(dāng)是調(diào)用運(yùn)算符函數(shù)的類的對象,但重載時(shí)左操作數(shù)是流第一個(gè)參數(shù)為ostream類的一個(gè)引用第二個(gè)參數(shù)為自定義的類類型的對象返回第一個(gè)參數(shù),使<<能連續(xù)使用例:cout<<a<<b;operator<<(cout,a)運(yùn)算符<<和>>的重載<<:重載格式為為復(fù)數(shù)類型重載<<#include<iostream.h>classcomplex{private:floatRe,Im;public:complex(floatr=0,floati=0){Re=r;Im=i;}

friendostream&operator<<(ostream&s,complexc){s<<c.Re<<“+”;s<<c.Im<<“i”<<endl;returns;}};voidmain(){complexa(3,4),b(5,6);cout<<a<<b;}

為復(fù)數(shù)類型重載<<#include<iostream.h>為復(fù)數(shù)類型重載>>#include<iostream.h>classcomplex{private:floatRe,Im;public:complex(floatr=0,floati=0){Re=r;Im=i;}

friendistream&operator>>(istream&s,complexc){s>>c.Re>>c.Im;returns;}};voidmain(){complexa(3,4),b(5,6);cin>>a>>b;}

輸入1234(注意不能輸入1,2,3,4逗號不是間隔)a=?為復(fù)數(shù)類型重載>>#include<iostream.h>運(yùn)算符<<和>>的重載istream&operator>>(istream&in,user_type&obj){…returnin;}注意:返回類型是類對象的引用,把幾個(gè)輸入運(yùn)算符放在同一條語句中時(shí),該重載函數(shù)仍能正確工作。第二個(gè)參數(shù)為引用,因?yàn)橐薷膶?shí)參假設(shè)定義為成員函數(shù)則cin>>d;解釋為:cin.operator>>(d);相當(dāng)于為istream類重載輸入運(yùn)算符運(yùn)算符<<和>>的重載istream&operator>>格式控制格式控制方法:使用ios類中有關(guān)格式控制的成員函數(shù)使用稱為控制符的特殊類型函數(shù)用ios類成員函數(shù)控制格式在ios類中說明了數(shù)據(jù)成員longx_flags,存放控制輸入輸出格式的狀態(tài)標(biāo)志,每個(gè)狀態(tài)標(biāo)志占一位。詳見p138設(shè)定了某個(gè)狀態(tài)標(biāo)志,則x_flags中對應(yīng)位為1,否則為0,可以幾個(gè)標(biāo)志并存例:對于12.0,如未置showpoint位,則輸出12,若置此位,輸出12.000000格式控制格式控制方法:格式控制用成員函數(shù)操作狀態(tài)標(biāo)志設(shè)置狀態(tài)標(biāo)志setf原型:longios::setf(longflags);使用:stream_obj.setf(ios::scientific);其中:stream_obj多為cin、cout設(shè)置多個(gè)標(biāo)志時(shí),彼此用或運(yùn)算符|分隔例:cout.setf(ios::dec|ios::scientific);清除狀態(tài)標(biāo)志unsetf原型:longios::unsetf(longflags);作用:把指定的狀態(tài)標(biāo)志位置0,即清除指定的狀態(tài)標(biāo)志取狀態(tài)標(biāo)志flags原型:longios::flags();longios::flags(longflags);作用:取狀態(tài)標(biāo)志格式控制用成員函數(shù)操作狀態(tài)標(biāo)志設(shè)置狀態(tài)標(biāo)志setf原型:lo操作狀態(tài)標(biāo)志的成員函數(shù)舉例#include<iostream.h>voidshowflags(longf){longi;for(i=0x8000;i;i=i>>1)if(i&f)cout<<“1”;elsecout<<“0”;cout<<“\n”;}voidmain(){longf;

f=cout.flags();showflags(f);

cout.setf(ios::showpos|ios::scientific);f=cout.flags();

showflags(f);

cout.unsetf(ios::scientific);f=cout.flags();showflags(f);}操作狀態(tài)標(biāo)志的成員函數(shù)舉例#include<iostrea格式控制設(shè)置域?qū)捲停篿ntios::width();返回當(dāng)前的域?qū)捴礽ntios::width(intwid);設(shè)置域?qū)?,并返回原域?qū)捥攸c(diǎn):設(shè)置的域?qū)拑H對下一個(gè)流輸出操作有效,當(dāng)一次輸出操作完成后,域?qū)捇謴?fù)為0設(shè)置填充字符:當(dāng)輸出值不足以填滿域?qū)挄r(shí)用該字符來填充原型:charios::fill();返回當(dāng)前的填充字符charios::fill(charc)用參數(shù)c重新設(shè)置填充字符, 并返回填充前的字符設(shè)置顯示精度原型:intios::precision();返回當(dāng)前的顯示精度intios::precision(intnum)用參數(shù)num重新設(shè)置顯 示精度,并返回設(shè)置前的顯示精度格式控制設(shè)置域?qū)捲停篿ntios::width();返回上述成員函數(shù)舉例#include<iostream.h>voidmain(){cout<<“defaultwidthis”<<cout.width()<<“\n”;cout<<“defaultfillis”<<cout.fill()<<“\n”;cout<<“defaultprecisionis”<<cout.precision()<<“\n”;cout<<666<<““<<123.45678<<“\n”;

cout.precision(3);cout.width(8);cout<<666<<““<<123.45678<<““<<456.78<<“\n”;cout<<“currentwidthis”<<cout.width()<<“\n”;cout<<“currentprecisionis”<<cout.precision()<<“\n”;

cout<<fill(‘*’);cout.width(8);cout<<666<<““<<123.45678<<“\n”;}defaultwidthis0defaultfillisdefaultprecisionis6666123.457666123457currentwidthis0currentprecisionis3*****666123上述成員函數(shù)舉例#include<iostream.h>格式控制結(jié)論:缺省域?qū)挒?;缺省的填充字符為空格;缺省的輸出精度為0,即按數(shù)據(jù)的實(shí)際精度輸出設(shè)置了顯示精度后,若數(shù)據(jù)的實(shí)際精度與設(shè)置的精度不一致,則輸出方法如下:實(shí)際精度大于設(shè)置精度時(shí),四舍五入后按設(shè)置的精度輸出;實(shí)際精度小于設(shè)置的精度時(shí),按實(shí)際精度輸出設(shè)置域?qū)捄?,只對其后最接近它的第一個(gè)輸出有影響,第一個(gè)輸出完成后系統(tǒng)立即把域?qū)捴?格式控制結(jié)論:用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時(shí),必須由流對象來調(diào)用它們,且不能把它們直接嵌入到輸入輸出語句中??刂品侯愃朴诤瘮?shù)的運(yùn)算符。用一個(gè)流引用作為參數(shù),并返回同一個(gè)流的引用標(biāo)準(zhǔn)控制符:dec:設(shè)置十進(jìn)制轉(zhuǎn)換基格式標(biāo)志hex:設(shè)置十六進(jìn)制轉(zhuǎn)換基格式標(biāo)志oct:設(shè)置八進(jìn)制轉(zhuǎn)換基格式標(biāo)志ws:提取空白字符,僅用于輸入endl:插入換行符并刷新流,僅用于輸出ends:在串后插入終止空字符,僅用于輸出flush:刷新輸出流,僅用于輸出setbase(intn):設(shè)置轉(zhuǎn)換基格式位n(取值0,8,16,10),缺省為0用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時(shí),必須由用控制符控制格式sesetiosflags(longf):清除由參數(shù)f指定的格式位,用于輸入輸出setfill(intc):設(shè)置填充字符,對于右對齊輸出,填充左面;對于左對齊輸出填充右面。一次設(shè)置多次有效。用于輸入輸出setprecision(intn):設(shè)置浮點(diǎn)數(shù)精度為n,用于輸入輸出setw(intn):設(shè)置域?qū)挒閚,只對下一次的輸出操作有效。用于輸入輸出上述控制符在iostream.h中定義,控制符函數(shù)在iomanip.h中定義,使用控制符函數(shù)時(shí)必須包含這兩個(gè)頭文件用控制符控制格式sesetiosflags(longf):控制符和控制符函數(shù)舉例#include<iostream.h>#include<iomanip.h>voidmain(){cout<<123<<setw(5)<<456<<88<<“\n”;cout<<123<<setw(5)<<setfill(‘*’)<<456<<setw(5)<<88<<“\n”;}12345688123**456***88控制符和控制符函數(shù)舉例#include<iostream.控制符和控制符函數(shù)舉例#include<iostream.h>#include<iomanip.h>voidmain(){floatv1=1360.53;floatv2=300.23;floatv3=84430.23;cout<<setiosflags(ios::showpoint|ios::fixed)<<setprecision(2)<<setfill(‘*’)<<setiosflags(ios::right);cout<<“\nCheckValue:$“<<setw(10)<<v1;cout<<“\nCheckValue:$“<<setw(10)<<v2;cout<<“\nCheckValue:$“<<setw(10)<<v3;}CheckValue:$***1360.53CheckValue:$****300.23CheckV

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論