版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第七章運算符重載及流類庫運算符重載類運算符和友元運算符++和--運算符的重載流類庫運算符“<<”和“>>”的重載格式控制文件操作方式流的錯誤處理第七章運算符重載及流類庫運算符重載運算符重載對基本數(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;運算符重載對基本數(shù)據(jù)類型,“+”、“–”等,C++用一種運算符重載運算符重載通過創(chuàng)建operator()和一個運算符連用構(gòu)成運算符函數(shù)實現(xiàn)格式:Typeoperator@(參數(shù)表){…//(函數(shù)定義)}例:intoperator+(x,y){…}返回值type不能是void@表示要重載的運算符,編譯時首先檢查傳遞給函數(shù)的參數(shù)類型,如果看到是自定義的類型,則執(zhí)行用戶自己的函數(shù)運算符重載運算符重載通過創(chuàng)建operator()和一個運算符運算符重載complexoperator+(complexom1,complexom2){complextemp;temp.real=om1.real+om2.real;temp.imag=om1.imag+om2.imag;returntemp;}total=c1+c2;(total=operator+(c1,c2);)運算符重載complexoperator+(comple運算符重載說明:只能重載C++語言中原先已有定義的運算符不能重載:..*::?:#不能改變運算符的操作數(shù)個數(shù)不能改變原有的優(yōu)先級x=y-a*b;不能改變原有的結(jié)合性x=a/b*c;不能改變運算符對預(yù)定義類型數(shù)據(jù)的操作方式+:為加法運算,無法重載而改變它對預(yù)定義類型數(shù)據(jù)的操作方式
重載運算符時至少有一個自定義類型的數(shù)據(jù)作為操作數(shù)運算符重載說明:類運算符成員運算符函數(shù)定義的語法形式:classX{…typeoperator@(參數(shù)表);…};說明:重載單目運算符,則參數(shù)表為空;若運算符為雙目運算符,則參數(shù)表中有一個操作數(shù)。雙目運算符重載:classX{…intoperator+(Xa);…};說明:參數(shù)作為運算符的右操作數(shù)。當(dāng)前對象作為運算符的左操作數(shù),通過this指針隱含地傳遞給函數(shù)類運算符成員運算符函數(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ù)重載雙目運算符后,使用的方法:aa@bb;aa.operator@(bb);類運算符雙目運算符classcomplex{采用成員函數(shù)重載雙目運算符后,使類運算符單目運算符單目運算符重載:參數(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ù)重載單目運算符后,使用的方法:@aa;aa.operator@();類運算符單目運算符單目運算符重載:classc{采用成員函雙目運算符可以被重載為成員函數(shù),但有一種情況:例:成員運算符函數(shù)重載了+運算符ob=ob+100解釋為ob.operator+(100)但:ob=100+ob;解釋為100.operator+(ob)錯誤類運算符雙目運算符可以被重載為成員函數(shù),但有一種情況:類運算符友元運算符友元運算符函數(shù)定義的語法形式:friendtypeoperator@(參數(shù)表);說明:友元函數(shù)沒有this指針,若重載的是雙目運算符,則參數(shù)表中有兩個操作數(shù);若重載的是單目運算符,則參數(shù)表中有一個操作數(shù)友元運算符友元運算符函數(shù)定義的語法形式:友元運算符雙目運算符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ù)重載雙目運算符后,使用的方法:aa@bb;operator@(aa,bb);友元運算符雙目運算符classcomplex{采用友元函數(shù)友元運算符單目運算符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ù)重載單目運算符后,使用的方法:采用引用參數(shù)傳遞操作數(shù),以改變操作數(shù)的值operator++(c&op)@aa;operator@(aa);不能用友元函數(shù)重載:=()[]->不要改變操作數(shù)時,可采用傳值的方法。友元運算符單目運算符classc{數(shù)據(jù)成員沒有自增?不能用成員運算符函數(shù)和友元運算符函數(shù)的比較雙目運算符:成員運算符函數(shù)帶有一個參數(shù),而友元運算符函數(shù)帶有兩個參數(shù)。單目運算符:成員運算符函數(shù)不帶參數(shù),而友元運算符函數(shù)帶有一個參數(shù)成員運算符函數(shù)和友元運算符函數(shù)的兩種調(diào)用方式。習(xí)慣形式友元運算符函數(shù)的調(diào)用成員運算符函數(shù)的調(diào)用a+boperator+(a,b)a.operator+(b)-aoperator-(a)a.operator-()a++operator++(a,0)a.operator++(0)對于雙目運算符,將它重載為一個友元運算符函數(shù)比重載為成員運算符函數(shù)便于使用。若運算符的操作要修改類對象的狀態(tài),則選成員運算符函數(shù)較好如運算符所需的操作數(shù)(尤其是第一個操作數(shù)需)希望有隱式類型轉(zhuǎn)換,則必須用友元成員運算符函數(shù)和友元運算符函數(shù)的比較雙目運算符:成員運算符函++和--運算符的重載對前綴方式++ob,可以用運算符函數(shù)重載為:ob.operator++();(成員函數(shù))或operator++(X&ob);(友元函數(shù))對后綴方式ob++,可以用運算符函數(shù)重載為:ob.operator++(int);(成員函數(shù))或operator++(X&ob,int);(友元函數(shù))調(diào)用時參數(shù)int一般被傳遞給值0++和--運算符的重載對前綴方式++ob,可以用運算符函數(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ù)原型進行檢查(參數(shù)個數(shù)、參數(shù)類型),可以避免許多錯誤,但是編譯系統(tǒng)對printf()和scanf()函數(shù)只檢查第一個參數(shù)(參數(shù)個數(shù)和類型信息包含在第一個參數(shù)中),所以,其他的錯誤無法在編譯時被發(fā)現(xiàn)。不可擴充性:不能對類對象進行輸入輸出C++流庫流:數(shù)據(jù)從源(數(shù)據(jù)的生產(chǎn)者)到漏(數(shù)據(jù)的消費者)的流動。流庫:為完成輸入輸出工作而預(yù)定義的類的集合,這些類構(gòu)成一個層次結(jié)構(gòu)的系統(tǒng)輸出:將一個對象的狀態(tài)換成一個字符序列,輸出到某個地方。向“流”中添加數(shù)據(jù)
輸入:從某個地方接收到一個字符序列,將其轉(zhuǎn)換成一個對象的狀態(tài)所要求的格式。從“流”中獲取數(shù)據(jù)
流類庫stdio.h中提供的printf和scanf的缺陷流類庫流類庫的基類:streambuf和ios類,所有的流類都是從它們直接或間接派生出的streambuf類:負責(zé)緩沖區(qū)的處理。緩沖區(qū)由一個字符序列和兩個指針組成,指針分別指向字符將被插入或被取出的位置。streambuffilebufstrstreambufconbuffilebuf:能夠處理文件。把filebuf同某個文件的描述字相聯(lián)系稱為打開該文件。strstreambuf:提供了在內(nèi)存中進行提取和插入操作的緩沖區(qū)管理。conbuf:能處理輸出,為輸出操作提供緩沖區(qū)管理。流類庫流類庫的基類:streambuf和ios類,所有的流類流類庫ios類:提供了使用流類的接口,都有一個指向streambuf的指針。ios是一個虛基類,定義了用于格式化輸入輸出及出錯處理的成員函數(shù)。iosistreamostreamiostreamios類派生出4個類:輸入流(istream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運算符“>>”,該類提供了流的大部分輸入操作輸出流(ostream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運算符“<<”,該類提供了流的主要輸出操作:文件流(fstreambase):提供了文件流的公共操作串流(strstreambase):專門處理串流流類庫ios類:提供了使用流類的接口,都有一個指向strea流類庫4種基本流類組合派生出實用流:輸入/輸出流(iostream):輸入/輸出文件流(fstream):輸入/輸出串流(strstream):屏幕輸出流(constream):輸入文件流(ifstream):輸出文件流(ofstream):輸入串流(istrstream):輸出串流(ostrstream):例:iostream是通過多重繼承從輸入流類istream和輸出流類ostream派生而來的。支持雙向操作。classios;classistream:virtualpublicios;classostream:virtualpublicios;classiostream:publicistream,publicostream;流類庫4種基本流類組合派生出實用流:在istream、ostream、iostream類的基礎(chǔ)上重載“=”,產(chǎn)生istream_withassign、ostream_withassign和 iostream_withassign流類庫在istream、ostream、iostream類的基礎(chǔ)上流類庫執(zhí)行C++程序時,系統(tǒng)自動打開幾個預(yù)定義流,用戶在程序中直接使用iostream.h:標準I/O流頭文件,在該文件中對各個流類定義了各自的全局對象。
cin:是istream_withassign類的對象,稱為標準輸入流,缺省為鍵盤cout:是ostream_withassign類的對象,稱為標準輸出流,缺省為顯示器cerr和clog:是ostream_withassign類的對象,稱為標準錯誤輸出流,固定關(guān)聯(lián)到顯示器。cerr沒有被緩沖,因而發(fā)送給它的任何內(nèi)容都立即輸出;相反clog被緩沖了,只有當(dāng)緩沖區(qū)滿時才輸出流類庫執(zhí)行C++程序時,系統(tǒng)自動打開幾個預(yù)定義流,用戶在程序例:要為用戶計算平均價格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)為零),下面的代碼能檢測用戶所輸入的數(shù)值并顯示出相應(yīng)的錯誤信息。cout<<“Howmanyunitsdidyousell?”;cin>>num;if(num==0){cerr<<“Theaveragecannotbecomputer.\n”);}else{…}例:要為用戶計算平均價格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)預(yù)定義類型的輸入輸出輸入運算符>>:雙目運算符,有兩個操作數(shù),左操作數(shù)是istream類的一個對象,右操作數(shù)既可以是一個預(yù)定義類型的變量,也可以是重載了該運算符的類對象缺省時:>>運算符跳過空白符,然后讀入與輸入變量類型相對應(yīng)的值。因此,給一組變量輸入值時可用空格或換行把鍵入的數(shù)值間隔開。intn;floatx;cin>>n>>x;當(dāng)輸入字符串時:>>運算符跳過空白符,讀入以下的非空白字符,直到遇到另一個空白字符為止,并在串尾放一個字符\0。char*str;cin>>str;輸入:objectprogramming!則:str=“object”預(yù)定義類型的輸入輸出輸入運算符>>:雙目運算符,有兩個操作數(shù)預(yù)定義類型的輸入輸出不同類型的變量一起輸入時,系統(tǒng)除檢查是否含有空白符外,還完成輸入數(shù)據(jù)與變量類型的匹配intn;floatx;cin>>n>>x;輸入:35.7889.25則:n=35x=.78輸入運算符>>采用左結(jié)合方式工作,并返回它的左操作數(shù)。預(yù)定義類型的輸入輸出不同類型的變量一起輸入時,系統(tǒng)除檢查是否預(yù)定義類型的輸入輸出輸出運算符:雙目運算符,有兩個操作數(shù),左操作數(shù)是ostream類的對象,右操作數(shù)既可以是一個預(yù)定義類型的變量,也可以是重載了該運算符的類對象<<運算符:采用左結(jié)合方式工作,并且返回它的左操作數(shù)。使用<<進行輸出操作時,編譯程序根據(jù)出現(xiàn)在運算符右邊的變量的類型決定調(diào)用重載該運算符的哪個版本重載不能改變運算符的優(yōu)先級cout<<x&y<<‘\n’;預(yù)定義類型的輸入輸出輸出運算符:雙目運算符,有兩個操作數(shù),左運算符<<和>>的重載<<:重載格式為ostream&operator<<(ostream&stream,CLASSAa){對于類CLASSA的輸出操作returnstream;}說明:假設(shè)定義為成員函數(shù)則左運算數(shù)應(yīng)當(dāng)是調(diào)用運算符函數(shù)的類的對象,但重載時左操作數(shù)是流第一個參數(shù)為ostream類的一個引用第二個參數(shù)為自定義的類類型的對象返回第一個參數(shù),使<<能連續(xù)使用例:cout<<a<<b;operator<<(cout,a)運算符<<和>>的重載<<:重載格式為為復(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>運算符<<和>>的重載istream&operator>>(istream&in,user_type&obj){…returnin;}注意:返回類型是類對象的引用,把幾個輸入運算符放在同一條語句中時,該重載函數(shù)仍能正確工作。第二個參數(shù)為引用,因為要修改實參假設(shè)定義為成員函數(shù)則cin>>d;解釋為:cin.operator>>(d);相當(dāng)于為istream類重載輸入運算符運算符<<和>>的重載istream&operator>>格式控制格式控制方法:使用ios類中有關(guān)格式控制的成員函數(shù)使用稱為控制符的特殊類型函數(shù)用ios類成員函數(shù)控制格式在ios類中說明了數(shù)據(jù)成員longx_flags,存放控制輸入輸出格式的狀態(tài)標志,每個狀態(tài)標志占一位。詳見p138設(shè)定了某個狀態(tài)標志,則x_flags中對應(yīng)位為1,否則為0,可以幾個標志并存例:對于12.0,如未置showpoint位,則輸出12,若置此位,輸出12.000000格式控制格式控制方法:格式控制用成員函數(shù)操作狀態(tài)標志設(shè)置狀態(tài)標志setf原型:longios::setf(longflags);使用:stream_obj.setf(ios::scientific);其中:stream_obj多為cin、cout設(shè)置多個標志時,彼此用或運算符|分隔例:cout.setf(ios::dec|ios::scientific);清除狀態(tài)標志unsetf原型:longios::unsetf(longflags);作用:把指定的狀態(tài)標志位置0,即清除指定的狀態(tài)標志取狀態(tài)標志flags原型:longios::flags();longios::flags(longflags);作用:取狀態(tài)標志格式控制用成員函數(shù)操作狀態(tài)標志設(shè)置狀態(tài)標志setf原型:lo操作狀態(tài)標志的成員函數(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)標志的成員函數(shù)舉例#include<iostrea格式控制設(shè)置域?qū)捲停篿ntios::width();返回當(dāng)前的域?qū)捴礽ntios::width(intwid);設(shè)置域?qū)?,并返回原域?qū)捥攸c:設(shè)置的域?qū)拑H對下一個流輸出操作有效,當(dāng)一次輸出操作完成后,域?qū)捇謴?fù)為0設(shè)置填充字符:當(dāng)輸出值不足以填滿域?qū)挄r用該字符來填充原型: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ù)據(jù)的實際精度與設(shè)置的精度不一致,則輸出方法如下:實際精度大于設(shè)置精度時,四舍五入后按設(shè)置的精度輸出;實際精度小于設(shè)置的精度時,按實際精度輸出設(shè)置域?qū)捄螅粚ζ浜笞罱咏牡谝粋€輸出有影響,第一個輸出完成后系統(tǒng)立即把域?qū)捴?格式控制結(jié)論:用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時,必須由流對象來調(diào)用它們,且不能把它們直接嵌入到輸入輸出語句中??刂品侯愃朴诤瘮?shù)的運算符。用一個流引用作為參數(shù),并返回同一個流的引用標準控制符:dec:設(shè)置十進制轉(zhuǎn)換基格式標志hex:設(shè)置十六進制轉(zhuǎn)換基格式標志oct:設(shè)置八進制轉(zhuǎn)換基格式標志ws:提取空白字符,僅用于輸入endl:插入換行符并刷新流,僅用于輸出ends:在串后插入終止空字符,僅用于輸出flush:刷新輸出流,僅用于輸出setbase(intn):設(shè)置轉(zhuǎn)換基格式位n(取值0,8,16,10),缺省為0用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時,必須由用控制符控制格式sesetiosflags(longf):清除由參數(shù)f指定的格式位,用于輸入輸出setfill(intc):設(shè)置填充字符,對于右對齊輸出,填充左面;對于左對齊輸出填充右面。一次設(shè)置多次有效。用于輸入輸出setprecision(intn):設(shè)置浮點數(shù)精度為n,用于輸入輸出setw(intn):設(shè)置域?qū)挒閚,只對下一次的輸出操作有效。用于輸入輸出上述控制符在iostream.h中定義,控制符函數(shù)在iomanip.h中定義,使用控制符函數(shù)時必須包含這兩個頭文件用控制符控制格式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è)備進行操作時,定義自己的控制函數(shù)能使得對這類設(shè)備的操作變得方便當(dāng)多次重復(fù)使用幾個相同的控制符時,可以把這些控制符合并在一個控制函數(shù)中,以便于用戶使用為輸出流定義控制函數(shù)的格式為:ostream&manip_name(ostream&str){…returnstr;}為輸入流定義控制函數(shù)的格式為:istream&manip_name(istream&str){…returnstr;}調(diào)用時只要直接寫出自定義控制符的名字: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文件和二進制文件ASCII文件:每個字節(jié)放一個ASCII代碼,表示一個字符,使用方便但占用的存儲空間較多。缺省時文件以正文方式打開,即在輸入時回車/換行序列轉(zhuǎn)換成字符‘\n’,輸出時字符‘\n’轉(zhuǎn)換成回車/換行序列二進制文件:把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣寫到外存儲器中。二進制文件可以節(jié)省外存空間,但它的一個字節(jié)不對應(yīng)一個字符打開文件:進行文件的輸入輸出,首先建立一個文件流,把該流和實際的文件相關(guān)聯(lián)關(guān)閉文件:取消文件和流的關(guān)聯(lián)文件流:輸入文件流、輸出文件流、輸入/輸出文件流文件操作方式文件:C++把文件當(dāng)成字符序列。按照數(shù)據(jù)的組織形面向文件的流類fstream.h:“文件流”頭文件,在該文件中對各個文件流類進行了定義,但是沒有預(yù)定義各自的全局對象。因為,在C++中文件類不是標準設(shè)備,不能預(yù)先定義。在頭文件fstream.h中給出了fstreambase、ifstream、ofstream、fstream類的定義。fstreambase是ifstream和ofstream的公共基類,fstream是ifstream和ofstream的派生類,都是公有繼承關(guān)系執(zhí)行文件輸入輸出前的三件事:在程序中包含頭文件fstream.h建立文件流,即說明面向文件流類的對象打開文件,即是使某個文件和某以文件流相關(guān)聯(lián)。(文件名和文件的打開方式是傳遞給構(gòu)造函數(shù)的實參)
面向文件的流類fstream.h:“文件流”頭文件,在該文件創(chuàng)建文件流時,需要使用面向文件的流類的構(gòu)造函數(shù)。每個面向文件的流類都有四個重載的構(gòu)造函數(shù)?fstream():創(chuàng)建一個未打開的文件流?fstream(constchar*,intmode,intprot=filebuf::openprot):創(chuàng)建一個打開的文件流第一個參數(shù)指定與此文件流相關(guān)聯(lián)的文件的名字第二個參數(shù)mode決定文件的打開方式app:追加數(shù)據(jù) ate:文件指針移到文件尾in:以輸入方式打開文件 out:以輸出方式打開文件binary:二進制方式打開文件trunc:文件存在清除原有內(nèi)容nocreate:文件不存在失敗 noreplace:文件存在失敗第三個參數(shù)決定文件的保護方式:0普通文件;1只讀文件;2隱含文件;4系統(tǒng)文件;8備份文件面向文件的流類創(chuàng)建文件流時,需要使用面向文件的流類的構(gòu)造函數(shù)。每個面向文件面向文件的流類創(chuàng)建ifstream類對象時,缺省的mode值為ios::in;創(chuàng)建ofstream類對象時,缺省的mode值為ios::out;未顯式指明以二進制方式打開文件,則缺省的方式為文本方式;?fstream(intfd):創(chuàng)建一個打開的文件流,并把它鏈接到文件柄為fd的文件?fstream(intfd,char*buf,intlen):創(chuàng)建一個打開的文件流,并把它鏈接到文件柄為fd的文件close函數(shù):關(guān)閉與該流對象相鏈接的文件,并清除流的錯誤狀態(tài)open(constchar*name,intmode,intprot=filebuf::openprot)函數(shù):打開名為name的文件例:建立一個輸入輸出文件流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類對象時,缺省的mode值文件的讀寫文本文件文本文件的讀寫:使用輸入運算符和輸出運算符例:把一個整數(shù)、浮點數(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;}文件的讀寫文本文件文本文件的讀寫:使用輸入運算符和輸出運算符文件的讀寫二進制二進制文件的讀寫:使用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;}文件的讀寫二進制二進制文件的讀寫:使用istream類的公有流的錯誤處理流的錯誤處理第七章運算符重載及流類庫運算符重載類運算符和友元運算符++和--運算符的重載流類庫運算符“<<”和“>>”的重載格式控制文件操作方式流的錯誤處理第七章運算符重載及流類庫運算符重載運算符重載對基本數(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;運算符重載對基本數(shù)據(jù)類型,“+”、“–”等,C++用一種運算符重載運算符重載通過創(chuàng)建operator()和一個運算符連用構(gòu)成運算符函數(shù)實現(xiàn)格式:Typeoperator@(參數(shù)表){…//(函數(shù)定義)}例:intoperator+(x,y){…}返回值type不能是void@表示要重載的運算符,編譯時首先檢查傳遞給函數(shù)的參數(shù)類型,如果看到是自定義的類型,則執(zhí)行用戶自己的函數(shù)運算符重載運算符重載通過創(chuàng)建operator()和一個運算符運算符重載complexoperator+(complexom1,complexom2){complextemp;temp.real=om1.real+om2.real;temp.imag=om1.imag+om2.imag;returntemp;}total=c1+c2;(total=operator+(c1,c2);)運算符重載complexoperator+(comple運算符重載說明:只能重載C++語言中原先已有定義的運算符不能重載:..*::?:#不能改變運算符的操作數(shù)個數(shù)不能改變原有的優(yōu)先級x=y-a*b;不能改變原有的結(jié)合性x=a/b*c;不能改變運算符對預(yù)定義類型數(shù)據(jù)的操作方式+:為加法運算,無法重載而改變它對預(yù)定義類型數(shù)據(jù)的操作方式
重載運算符時至少有一個自定義類型的數(shù)據(jù)作為操作數(shù)運算符重載說明:類運算符成員運算符函數(shù)定義的語法形式:classX{…typeoperator@(參數(shù)表);…};說明:重載單目運算符,則參數(shù)表為空;若運算符為雙目運算符,則參數(shù)表中有一個操作數(shù)。雙目運算符重載:classX{…intoperator+(Xa);…};說明:參數(shù)作為運算符的右操作數(shù)。當(dāng)前對象作為運算符的左操作數(shù),通過this指針隱含地傳遞給函數(shù)類運算符成員運算符函數(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ù)重載雙目運算符后,使用的方法:aa@bb;aa.operator@(bb);類運算符雙目運算符classcomplex{采用成員函數(shù)重載雙目運算符后,使類運算符單目運算符單目運算符重載:參數(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ù)重載單目運算符后,使用的方法:@aa;aa.operator@();類運算符單目運算符單目運算符重載:classc{采用成員函雙目運算符可以被重載為成員函數(shù),但有一種情況:例:成員運算符函數(shù)重載了+運算符ob=ob+100解釋為ob.operator+(100)但:ob=100+ob;解釋為100.operator+(ob)錯誤類運算符雙目運算符可以被重載為成員函數(shù),但有一種情況:類運算符友元運算符友元運算符函數(shù)定義的語法形式:friendtypeoperator@(參數(shù)表);說明:友元函數(shù)沒有this指針,若重載的是雙目運算符,則參數(shù)表中有兩個操作數(shù);若重載的是單目運算符,則參數(shù)表中有一個操作數(shù)友元運算符友元運算符函數(shù)定義的語法形式:友元運算符雙目運算符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ù)重載雙目運算符后,使用的方法:aa@bb;operator@(aa,bb);友元運算符雙目運算符classcomplex{采用友元函數(shù)友元運算符單目運算符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ù)重載單目運算符后,使用的方法:采用引用參數(shù)傳遞操作數(shù),以改變操作數(shù)的值operator++(c&op)@aa;operator@(aa);不能用友元函數(shù)重載:=()[]->不要改變操作數(shù)時,可采用傳值的方法。友元運算符單目運算符classc{數(shù)據(jù)成員沒有自增?不能用成員運算符函數(shù)和友元運算符函數(shù)的比較雙目運算符:成員運算符函數(shù)帶有一個參數(shù),而友元運算符函數(shù)帶有兩個參數(shù)。單目運算符:成員運算符函數(shù)不帶參數(shù),而友元運算符函數(shù)帶有一個參數(shù)成員運算符函數(shù)和友元運算符函數(shù)的兩種調(diào)用方式。習(xí)慣形式友元運算符函數(shù)的調(diào)用成員運算符函數(shù)的調(diào)用a+boperator+(a,b)a.operator+(b)-aoperator-(a)a.operator-()a++operator++(a,0)a.operator++(0)對于雙目運算符,將它重載為一個友元運算符函數(shù)比重載為成員運算符函數(shù)便于使用。若運算符的操作要修改類對象的狀態(tài),則選成員運算符函數(shù)較好如運算符所需的操作數(shù)(尤其是第一個操作數(shù)需)希望有隱式類型轉(zhuǎn)換,則必須用友元成員運算符函數(shù)和友元運算符函數(shù)的比較雙目運算符:成員運算符函++和--運算符的重載對前綴方式++ob,可以用運算符函數(shù)重載為:ob.operator++();(成員函數(shù))或operator++(X&ob);(友元函數(shù))對后綴方式ob++,可以用運算符函數(shù)重載為:ob.operator++(int);(成員函數(shù))或operator++(X&ob,int);(友元函數(shù))調(diào)用時參數(shù)int一般被傳遞給值0++和--運算符的重載對前綴方式++ob,可以用運算符函數(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ù)原型進行檢查(參數(shù)個數(shù)、參數(shù)類型),可以避免許多錯誤,但是編譯系統(tǒng)對printf()和scanf()函數(shù)只檢查第一個參數(shù)(參數(shù)個數(shù)和類型信息包含在第一個參數(shù)中),所以,其他的錯誤無法在編譯時被發(fā)現(xiàn)。不可擴充性:不能對類對象進行輸入輸出C++流庫流:數(shù)據(jù)從源(數(shù)據(jù)的生產(chǎn)者)到漏(數(shù)據(jù)的消費者)的流動。流庫:為完成輸入輸出工作而預(yù)定義的類的集合,這些類構(gòu)成一個層次結(jié)構(gòu)的系統(tǒng)輸出:將一個對象的狀態(tài)換成一個字符序列,輸出到某個地方。向“流”中添加數(shù)據(jù)
輸入:從某個地方接收到一個字符序列,將其轉(zhuǎn)換成一個對象的狀態(tài)所要求的格式。從“流”中獲取數(shù)據(jù)
流類庫stdio.h中提供的printf和scanf的缺陷流類庫流類庫的基類:streambuf和ios類,所有的流類都是從它們直接或間接派生出的streambuf類:負責(zé)緩沖區(qū)的處理。緩沖區(qū)由一個字符序列和兩個指針組成,指針分別指向字符將被插入或被取出的位置。streambuffilebufstrstreambufconbuffilebuf:能夠處理文件。把filebuf同某個文件的描述字相聯(lián)系稱為打開該文件。strstreambuf:提供了在內(nèi)存中進行提取和插入操作的緩沖區(qū)管理。conbuf:能處理輸出,為輸出操作提供緩沖區(qū)管理。流類庫流類庫的基類:streambuf和ios類,所有的流類流類庫ios類:提供了使用流類的接口,都有一個指向streambuf的指針。ios是一個虛基類,定義了用于格式化輸入輸出及出錯處理的成員函數(shù)。iosistreamostreamiostreamios類派生出4個類:輸入流(istream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運算符“>>”,該類提供了流的大部分輸入操作輸出流(ostream)針對系統(tǒng)全部的預(yù)定義類型重載了輸入運算符“<<”,該類提供了流的主要輸出操作:文件流(fstreambase):提供了文件流的公共操作串流(strstreambase):專門處理串流流類庫ios類:提供了使用流類的接口,都有一個指向strea流類庫4種基本流類組合派生出實用流:輸入/輸出流(iostream):輸入/輸出文件流(fstream):輸入/輸出串流(strstream):屏幕輸出流(constream):輸入文件流(ifstream):輸出文件流(ofstream):輸入串流(istrstream):輸出串流(ostrstream):例:iostream是通過多重繼承從輸入流類istream和輸出流類ostream派生而來的。支持雙向操作。classios;classistream:virtualpublicios;classostream:virtualpublicios;classiostream:publicistream,publicostream;流類庫4種基本流類組合派生出實用流:在istream、ostream、iostream類的基礎(chǔ)上重載“=”,產(chǎn)生istream_withassign、ostream_withassign和 iostream_withassign流類庫在istream、ostream、iostream類的基礎(chǔ)上流類庫執(zhí)行C++程序時,系統(tǒng)自動打開幾個預(yù)定義流,用戶在程序中直接使用iostream.h:標準I/O流頭文件,在該文件中對各個流類定義了各自的全局對象。
cin:是istream_withassign類的對象,稱為標準輸入流,缺省為鍵盤cout:是ostream_withassign類的對象,稱為標準輸出流,缺省為顯示器cerr和clog:是ostream_withassign類的對象,稱為標準錯誤輸出流,固定關(guān)聯(lián)到顯示器。cerr沒有被緩沖,因而發(fā)送給它的任何內(nèi)容都立即輸出;相反clog被緩沖了,只有當(dāng)緩沖區(qū)滿時才輸出流類庫執(zhí)行C++程序時,系統(tǒng)自動打開幾個預(yù)定義流,用戶在程序例:要為用戶計算平均價格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)為零),下面的代碼能檢測用戶所輸入的數(shù)值并顯示出相應(yīng)的錯誤信息。cout<<“Howmanyunitsdidyousell?”;cin>>num;if(num==0){cerr<<“Theaveragecannotbecomputer.\n”);}else{…}例:要為用戶計算平均價格,但用戶的輸入不恰當(dāng)(例如輸入發(fā)除數(shù)預(yù)定義類型的輸入輸出輸入運算符>>:雙目運算符,有兩個操作數(shù),左操作數(shù)是istream類的一個對象,右操作數(shù)既可以是一個預(yù)定義類型的變量,也可以是重載了該運算符的類對象缺省時:>>運算符跳過空白符,然后讀入與輸入變量類型相對應(yīng)的值。因此,給一組變量輸入值時可用空格或換行把鍵入的數(shù)值間隔開。intn;floatx;cin>>n>>x;當(dāng)輸入字符串時:>>運算符跳過空白符,讀入以下的非空白字符,直到遇到另一個空白字符為止,并在串尾放一個字符\0。char*str;cin>>str;輸入:objectprogramming!則:str=“object”預(yù)定義類型的輸入輸出輸入運算符>>:雙目運算符,有兩個操作數(shù)預(yù)定義類型的輸入輸出不同類型的變量一起輸入時,系統(tǒng)除檢查是否含有空白符外,還完成輸入數(shù)據(jù)與變量類型的匹配intn;floatx;cin>>n>>x;輸入:35.7889.25則:n=35x=.78輸入運算符>>采用左結(jié)合方式工作,并返回它的左操作數(shù)。預(yù)定義類型的輸入輸出不同類型的變量一起輸入時,系統(tǒng)除檢查是否預(yù)定義類型的輸入輸出輸出運算符:雙目運算符,有兩個操作數(shù),左操作數(shù)是ostream類的對象,右操作數(shù)既可以是一個預(yù)定義類型的變量,也可以是重載了該運算符的類對象<<運算符:采用左結(jié)合方式工作,并且返回它的左操作數(shù)。使用<<進行輸出操作時,編譯程序根據(jù)出現(xiàn)在運算符右邊的變量的類型決定調(diào)用重載該運算符的哪個版本重載不能改變運算符的優(yōu)先級cout<<x&y<<‘\n’;預(yù)定義類型的輸入輸出輸出運算符:雙目運算符,有兩個操作數(shù),左運算符<<和>>的重載<<:重載格式為ostream&operator<<(ostream&stream,CLASSAa){對于類CLASSA的輸出操作returnstream;}說明:假設(shè)定義為成員函數(shù)則左運算數(shù)應(yīng)當(dāng)是調(diào)用運算符函數(shù)的類的對象,但重載時左操作數(shù)是流第一個參數(shù)為ostream類的一個引用第二個參數(shù)為自定義的類類型的對象返回第一個參數(shù),使<<能連續(xù)使用例:cout<<a<<b;operator<<(cout,a)運算符<<和>>的重載<<:重載格式為為復(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>運算符<<和>>的重載istream&operator>>(istream&in,user_type&obj){…returnin;}注意:返回類型是類對象的引用,把幾個輸入運算符放在同一條語句中時,該重載函數(shù)仍能正確工作。第二個參數(shù)為引用,因為要修改實參假設(shè)定義為成員函數(shù)則cin>>d;解釋為:cin.operator>>(d);相當(dāng)于為istream類重載輸入運算符運算符<<和>>的重載istream&operator>>格式控制格式控制方法:使用ios類中有關(guān)格式控制的成員函數(shù)使用稱為控制符的特殊類型函數(shù)用ios類成員函數(shù)控制格式在ios類中說明了數(shù)據(jù)成員longx_flags,存放控制輸入輸出格式的狀態(tài)標志,每個狀態(tài)標志占一位。詳見p138設(shè)定了某個狀態(tài)標志,則x_flags中對應(yīng)位為1,否則為0,可以幾個標志并存例:對于12.0,如未置showpoint位,則輸出12,若置此位,輸出12.000000格式控制格式控制方法:格式控制用成員函數(shù)操作狀態(tài)標志設(shè)置狀態(tài)標志setf原型:longios::setf(longflags);使用:stream_obj.setf(ios::scientific);其中:stream_obj多為cin、cout設(shè)置多個標志時,彼此用或運算符|分隔例:cout.setf(ios::dec|ios::scientific);清除狀態(tài)標志unsetf原型:longios::unsetf(longflags);作用:把指定的狀態(tài)標志位置0,即清除指定的狀態(tài)標志取狀態(tài)標志flags原型:longios::flags();longios::flags(longflags);作用:取狀態(tài)標志格式控制用成員函數(shù)操作狀態(tài)標志設(shè)置狀態(tài)標志setf原型:lo操作狀態(tài)標志的成員函數(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)標志的成員函數(shù)舉例#include<iostrea格式控制設(shè)置域?qū)捲停篿ntios::width();返回當(dāng)前的域?qū)捴礽ntios::width(intwid);設(shè)置域?qū)挘⒎祷卦驅(qū)捥攸c:設(shè)置的域?qū)拑H對下一個流輸出操作有效,當(dāng)一次輸出操作完成后,域?qū)捇謴?fù)為0設(shè)置填充字符:當(dāng)輸出值不足以填滿域?qū)挄r用該字符來填充原型: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ù)據(jù)的實際精度與設(shè)置的精度不一致,則輸出方法如下:實際精度大于設(shè)置精度時,四舍五入后按設(shè)置的精度輸出;實際精度小于設(shè)置的精度時,按實際精度輸出設(shè)置域?qū)捄螅粚ζ浜笞罱咏牡谝粋€輸出有影響,第一個輸出完成后系統(tǒng)立即把域?qū)捴?格式控制結(jié)論:用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時,必須由流對象來調(diào)用它們,且不能把它們直接嵌入到輸入輸出語句中。控制符:類似于函數(shù)的運算符。用一個流引用作為參數(shù),并返回同一個流的引用標準控制符:dec:設(shè)置十進制轉(zhuǎn)換基格式標志hex:設(shè)置十六進制轉(zhuǎn)換基格式標志oct:設(shè)置八進制轉(zhuǎn)換基格式標志ws:提取空白字符,僅用于輸入endl:插入換行符并刷新流,僅用于輸出ends:在串后插入終止空字符,僅用于輸出flush:刷新輸出流,僅用于輸出setbase(intn):設(shè)置轉(zhuǎn)換基格式位n(取值0,8,16,10),缺省為0用控制符控制格式ios類的成員函數(shù)控制輸入輸出格式時,必須由用控制符控制格式sesetiosflags(longf):清除由參數(shù)f指定的格式位,用于輸入輸出setfill(intc):設(shè)置填充字符,對于右對齊輸出,填充左面;對于左對齊輸出填充右面。一次設(shè)置多次有效。用于輸入輸出setprecision(intn):設(shè)置浮點數(shù)精度為n,用于輸入輸出setw(intn):設(shè)置域?qū)挒閚,只對下一次的輸出操作有效。用于輸入輸出上述控制符在iostream.h中定義,控制符函數(shù)在iomanip.h中定義,使用控制符函數(shù)時必須包含這兩個頭文件用控制符控制格式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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 通訊行業(yè)營業(yè)員崗位總結(jié)
- 幼兒園工作總結(jié)點亮孩子未來的希望
- 醫(yī)療器械行業(yè)技術(shù)崗位總結(jié)
- 2024校園消防安全應(yīng)急預(yù)案(34篇)
- 減資協(xié)議書(2篇)
- 別墅區(qū)住宅租賃協(xié)議(2篇)
- 全民讀書心得體會
- Unit1TeenageLife(詞匯短語句式)-2025屆高三人教版英語一輪復(fù)習(xí)闖關(guān)攻略(解析版)
- 第9課 列寧與十月革命(分層作業(yè))(解析版)
- 2023-2024學(xué)年北京市昌平區(qū)高三上學(xué)期期末考試地理試題(解析版)
- 農(nóng)貿(mào)市場安全生產(chǎn)風(fēng)險分級管控和隱患排查治理雙體系方案全套資料2019-2020完整實施方案模板
- 網(wǎng)絡(luò)安全設(shè)備巡檢報告
- 人教版 五年級上冊道德與法治全冊各課及單元同步檢測試卷【含答案】
- T梁濕接縫及橫隔梁施工方案
- 校園廣播系統(tǒng)施工安裝方案
- 掛籃檢查驗收記錄表
- 小學(xué)勞動教育培訓(xùn)心得體會
- 《眼科常見疾病護理》
- 2023部編人教版八年級上冊道德與法治知識點提綱
- 暫緩執(zhí)行拘留申請書
- 乙肝五項操作規(guī)程(膠體金法)
評論
0/150
提交評論