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

下載本文檔

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

文檔簡介

第九章運(yùn)算符重載及流類庫C++程序設(shè)計(jì)1/36本章主要內(nèi)容運(yùn)算符重載流類庫文件流2/36運(yùn)算符重載 C++語言允許程序員重新定義已有的運(yùn)算符,使其能按用戶的要求完成一些特定的操作,這就是所謂的運(yùn)算符重載。 運(yùn)算符重載與函數(shù)重載相似,其目的是設(shè)置某一運(yùn)算符,讓它具有另一種功能,盡管此運(yùn)算符在原先C++語言中代表另一種含義,但他們彼此之間并不沖突。C++會(huì)根據(jù)運(yùn)算符的位置辨別應(yīng)使用哪一種功能進(jìn)行運(yùn)算。

3/36運(yùn)算符重載 C++內(nèi)部任何運(yùn)算都是通過函數(shù)來實(shí)現(xiàn)的。運(yùn)算符重載的實(shí)質(zhì)就是函數(shù)重載。 在實(shí)現(xiàn)過程中,首先把指定的運(yùn)算表達(dá)式轉(zhuǎn)化為對運(yùn)算符函數(shù)的調(diào)用,運(yùn)算對象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參,然后根據(jù)實(shí)參的類型來確定需要調(diào)用的函數(shù),這個(gè)過程是在編譯過程中完成的。4/36運(yùn)算符重載 運(yùn)算符的重載形式有兩種:重載為類的成員函數(shù)和重載為類的友元函數(shù)。 運(yùn)算符重載為類的成員函數(shù)的語法形式如下:<函數(shù)類型>operator<運(yùn)算符>(<形參表>){ <函數(shù)體>;} 運(yùn)算符重載為類的友元函數(shù)的語法形式如下:friend<函數(shù)類型>operator<運(yùn)算符>(<形參表>){ <函數(shù)體>;}5/36例9.16/36P186<<、>>和++運(yùn)算符重載實(shí)例插入符函數(shù)的一般形式為:ostream&operator<<(ostream&函數(shù)的流,類名&對象名){……//函數(shù)代碼return函數(shù)的流;}提取符函數(shù)的一般形式為:istream&operator>>(istream&函數(shù)的流,類名&對象名){……//函數(shù)代碼return函數(shù)的流;}7/36例9.28/36例9.3函數(shù)調(diào)用方式;直接使用運(yùn)算符9/36例9.4

10/36類運(yùn)算符和友元運(yùn)算符的區(qū)別P190如果運(yùn)算符所需的操作數(shù),尤其是第一個(gè)操作數(shù)希望進(jìn)行隱式類型轉(zhuǎn)換,則該運(yùn)算符應(yīng)該通過友元來重載。另一方面,如果一個(gè)運(yùn)算符的操作需要修改類對象的狀態(tài),則應(yīng)當(dāng)使用類運(yùn)算符,這樣更符合數(shù)據(jù)封裝的要求。但參數(shù)是使用引用還是對象,則要根據(jù)運(yùn)算符在使用中可能出現(xiàn)的情況來決定。11/36friendcomplexoperator+(形參1,形參2){……//函數(shù)體定義}關(guān)鍵字friend把complexoperator+(形參1,形參2)說明成類的友元,使得它能夠訪問類complex的私有數(shù)據(jù)。形參可以都是對象或者對象的引用;形參也可以一個(gè)為對象一個(gè)為引用,這要視具體問題而定。12/36例9.513/36例9.614/36流類庫在C++中,輸入輸出操作是由“流”來處理的。所謂流,它是C++的一個(gè)核心概念,數(shù)據(jù)從一個(gè)位置到另一個(gè)位置的流動(dòng)抽象為流。當(dāng)數(shù)據(jù)從鍵盤或磁盤文件流入到程序中時(shí),這樣的流稱為輸入流,把輸入數(shù)據(jù)來自的地方稱為“源”當(dāng)數(shù)據(jù)從程序中流向屏幕或磁盤文件時(shí),這樣的流稱為輸出流,把接收輸出數(shù)據(jù)的地方稱為“目標(biāo)”15/36流類庫當(dāng)流被建立后就可以使用一些特定的操作從流中獲取數(shù)據(jù),如輸入操作;也可向流中添加數(shù)據(jù),如輸出操作。從流中獲取數(shù)據(jù)的操作稱為提取操作,向流中添加數(shù)據(jù)的操作稱為插入操作。執(zhí)行輸入、輸出的類體系叫做流類提供這個(gè)流類實(shí)現(xiàn)的系統(tǒng)庫叫做流類庫16/36流類庫C++針對流的特點(diǎn),構(gòu)造了功能強(qiáng)大的輸入輸出流庫iosistreamostreamiostreamstreambufios類用來提供一些關(guān)于對流狀態(tài)進(jìn)行設(shè)置的功能,它是一個(gè)虛基類,其它類都是從這個(gè)派生而來但streambuf不是ios類的派生類,在類ios中只是有一個(gè)指針成員,指向streambuf類的一個(gè)對象。streambuf類是用來為ios類及其派生類提供對數(shù)據(jù)的緩沖支持。緩沖,是指系統(tǒng)在主存中開辟一個(gè)專用的區(qū)域用來臨時(shí)存放輸入輸出信息,這個(gè)區(qū)域稱為緩沖區(qū)。有了緩沖以后,輸入輸出時(shí)所占用的CPU時(shí)間就大大減少了,提高了系統(tǒng)的效率。因?yàn)橹挥挟?dāng)緩沖區(qū)滿時(shí),或當(dāng)前送入的數(shù)據(jù)為新的一行時(shí),系統(tǒng)才對流中的數(shù)據(jù)進(jìn)行處理,稱為刷新。itream和ostream類均是ios的公有派生類,前者提供了從流中提取數(shù)據(jù)的有關(guān)操作,后者則是提供了向流中插入數(shù)據(jù)的有關(guān)操作。iostream類是itream和ostream類公有派生的,該類并沒有提供新的操作,只是將itream和ostream類綜合在一起,提供一種方便。17/36流類庫P194為了方便用戶對基本輸入輸出流進(jìn)行操作,只要在程序中包含頭文件iostream,就可以使用C++提供的四個(gè)預(yù)定義的標(biāo)準(zhǔn)流對象:cin、cout、cerr和clog,它們都是std名稱空間的流對象。cin是istream類的對象,用處理可定向得標(biāo)準(zhǔn)輸入,即鍵盤輸入。cout是ostream類的對象,用處理標(biāo)準(zhǔn)輸出,即屏幕輸出。cerr和clog都是ostream類的對象,用來處理標(biāo)準(zhǔn)出錯(cuò)信息,并將信息顯示在屏幕上。在這四個(gè)標(biāo)準(zhǔn)流對象中,除了cerr不支持緩沖(發(fā)送給它的內(nèi)容立即被輸出到屏幕,并且不能被重定向到其它地方),其余三個(gè)都帶有緩沖區(qū)。標(biāo)準(zhǔn)流通常使用提取運(yùn)算符“>>”和插入運(yùn)算符“<<”來進(jìn)行輸入輸出操作的,而且系統(tǒng)還會(huì)自動(dòng)地完成數(shù)據(jù)類型的轉(zhuǎn)換。18/36

一種具體的物理設(shè)備,比如說鍵盤聯(lián)接起來。C++的流類庫預(yù)定義的4個(gè)流所聯(lián)接起的具體設(shè)備為:cin

與標(biāo)準(zhǔn)輸入設(shè)備相聯(lián)接cout

與標(biāo)準(zhǔn)輸出設(shè)備相聯(lián)接cerr

與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相聯(lián)接(非緩沖方式)clog與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相聯(lián)接(緩沖方式)19/36文件流C++將文件看作是由連續(xù)的字符(字節(jié))的數(shù)據(jù)順序組成的。根據(jù)文件中數(shù)據(jù)的組織方式,可分為文本文件(ASCII文件)和二進(jìn)制文件。文本文件中每一個(gè)字節(jié)用以存放一個(gè)字符的ASCII碼值,而二進(jìn)制文件是將數(shù)據(jù)用二進(jìn)制形式存放在文件中,它保持了數(shù)據(jù)在內(nèi)存中存放的原有格式。無論是文本文件還是二進(jìn)制文件,都需要用文件指針來操縱。一個(gè)文件指針總是和一個(gè)文件所關(guān)聯(lián)的,當(dāng)文件每一次打開時(shí),文件指針指向文件的開始,隨著對文件的處理,文件指針不斷地在文件中移動(dòng),并一直指向最新處理的字符(字節(jié))位置。20/36P194ios

是…虛基類21/3622/36文件流為方便用戶對文件的操作,C++提供了文件操作的文件流庫filebufofstreamifstreamfstreamiosistreamostreamiostreamstreambufifstream類是從istream類公有派生而來,用來支持從輸入文件中提取數(shù)據(jù)的各種操作ofstream類是從ostream公有派生而來,用來實(shí)現(xiàn)把數(shù)據(jù)寫入到文件中的各種操作。fstream類是從iostream類公有派生而來,提供從文件中提取數(shù)據(jù)或把數(shù)據(jù)寫入到文件的各種操作。filebuf類從streambuf類派生而來,用來管理磁盤文件的緩沖區(qū),應(yīng)用程序中一般很少涉及到該類。23/36文件流P199C++中文件輸入/輸出的基本過程1.在程序中要包含頭文件fstream.h。2.創(chuàng)建一個(gè)流。ifstreamiFile;ofstreamoFile;fstreamioFile;3.將這個(gè)流與文件相關(guān)聯(lián),即打開文件。voidopen(constchar*filename,intmode,intaccess);4.文件的讀寫操作。5.關(guān)閉文件。iFile.close();oFile.close();參照P200【例9.9】24/36P19625/36P197

26/36例9.727/36例9.928/36文件流輸出流的open函數(shù),即打開文件voidopen(constchar*filename,intmode,intfilebuf::openprot);文件打開方式說明Ios_base::in以輸入方式打開文件,即讀文件(ifstream類對象默認(rèn)方式)Ios_base::out以輸出方式打開文件,即寫文件(ofstream類對象默認(rèn)方式)Ios_base::app以添加方式打開文件,新增加的內(nèi)容添加在文件尾Ios_base::ate以添加方式打開文件,新增加的內(nèi)容添加在文件尾,但下次添加時(shí)則添加在當(dāng)前位置Ios_base::trunc如文件存在就打開并清除其內(nèi)容,如不存在就建立新文件Ios_base::binary以二進(jìn)制方式打開文件(默認(rèn)為文本文件)Ios_base::nocreate打開已有文件,若文件不存在,則打開失敗Ios_base::noreplace若打開的文件已經(jīng)存在,則打開失敗文件名訪問模式打開方式29/36文件流filebuf::openport 共享方式,默認(rèn)的方式filebuf::sh_none 獨(dú)占方式,不允許共享filebuf::sh_read 允許讀共享filebuf::sh_write 允許寫共享30/36文件流

關(guān)閉文件時(shí),系統(tǒng)把該文件相關(guān)聯(lián)的文件緩沖區(qū)中的數(shù)據(jù)寫到文件中,保證文件的完整,收回與該文件相關(guān)的內(nèi)存空間,可供再分配,把磁盤文件名與文件流對象之間的關(guān)聯(lián)斷開,可防止誤操作修改了磁盤文件。如又要對文件操作必須重新打開。三個(gè)文件流類各有一個(gè)關(guān)閉文件的成員函數(shù):voidifstream::close();voidofstream::close();voidfstream::close();使用很方便,如:iFile.close();oFile.close(); iofile.close();31/36文件流對一個(gè)流對象進(jìn)行輸入、輸出操作時(shí),可能會(huì)產(chǎn)生錯(cuò)誤,一般在進(jìn)行文件的操作時(shí),需要進(jìn)行相應(yīng)的錯(cuò)誤判斷if(cin.good())cin>>data;表示沒有錯(cuò)誤和文件沒有結(jié)束時(shí),才從文件獲取數(shù)據(jù)32/36文件流處理錯(cuò)誤的成員函數(shù)及功能如下:成員函數(shù)功能bad()如果進(jìn)行非法操作,返回true,否則返回falseclear()清除內(nèi)部錯(cuò)誤狀態(tài)eof()若文件讀到末尾,返回true,否則返回falsegood(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論