C++程序設計課件:第7章 輸入輸出流_第1頁
C++程序設計課件:第7章 輸入輸出流_第2頁
C++程序設計課件:第7章 輸入輸出流_第3頁
C++程序設計課件:第7章 輸入輸出流_第4頁
C++程序設計課件:第7章 輸入輸出流_第5頁
已閱讀5頁,還剩90頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、輸入/輸出流層次 終端輸入/輸出 文件讀寫,輸入/輸出流,流 - 數(shù)據(jù)在程序和設備之間“流動”,流的基本概念,流的基本概念,流 - 可以看作一個無限長的二進制數(shù)字序列 通過讀寫指針進行流的讀和寫(以字節(jié)為單位),將流上的數(shù)據(jù)讀進變量x,將y的值寫入流,y,x,輸出流 可以看作一端無限,另一端通過寫指針不停地向后寫入新內(nèi)容的單向流,,寫指針,流的基本概念,輸入流 可以看作一端無限,另一端通過讀指針不停地從流中讀取新內(nèi)容的單向流,讀出的內(nèi)容從流中刪去。,讀指針,流的基本概念,有格式讀寫,以某種數(shù)據(jù)類型為單位讀寫 例如:讀一個整數(shù),寫一個浮點數(shù)等; 無格式讀寫,以字節(jié)為單位讀寫,不區(qū)分其中的內(nèi)容 例

2、如:讀20個字節(jié),寫50個字節(jié)等;,有格式讀寫和無格式讀寫字符方式/二進制方式讀寫,緩沖,引入緩沖的目的是解決CPU的運行速度和外設操作速度 不匹配的矛盾。如輸出時先寫入緩沖區(qū),再成批輸出。 成批寫出數(shù)據(jù)比一個一個寫出數(shù)據(jù)節(jié)約時間。,一般地,緩沖區(qū)在內(nèi)存中。,向輸出流中寫數(shù)據(jù)時,通常是先向緩沖區(qū)中寫,當緩沖區(qū)寫滿時,才真正向輸出流寫;也可以通過函數(shù)在程序中主動將緩沖區(qū)內(nèi)容寫入輸出流。,緩沖區(qū)刷新,基本輸入輸出流類體系,C+預定義了流類,用于完成數(shù)據(jù)的“流動”(輸入輸出),流基類,通用輸入流基類,通用輸出流基類,通用輸入輸出流類基類,抽象緩沖區(qū)基類,在這些已定義的類中, 給出了若干方法(成員函數(shù)

3、), 用于控制輸入輸出。,使用上述流類,必須包含頭文件 “ iostream”,用運算符重載實現(xiàn)標準設備的輸入輸出,觀察頭文件istream.h :,class istream : virtual public ios public: istream,C+ 對基本的數(shù)據(jù)類型,均定義了重載運算符 ,將右移位運算符 重載為 提取 運算符, class istream_withassign : public istream ; extern istream cin; ,編譯器會將 cinxy; 解釋成 (cin.operator(x) .operator(y);,I/O流 C+的輸入/輸出操作由標準

4、I/O庫實現(xiàn),通常稱為I/O流 I/O流是一個利用模板、多繼承和虛繼承實現(xiàn)的類層次結(jié)構(gòu),用它可以進行內(nèi)置數(shù)據(jù)類型的終端(控制臺)、文件和內(nèi)存輸入/輸出操作 類的設計者也可以擴展I/O流類層次,來處理自定義類型數(shù)據(jù)的輸入和輸出,終端輸入輸出 終端輸入操作由輸入流istream提供 終端輸出操作由輸出流ostream提供 iostream是同時從istream和ostream派生的類,允許雙向的輸入/輸出 為了使用輸入/輸出操作,需要包含頭文件 iostream庫預定義了一些標準流對象: cin:istream類對象,代表標準輸入,用于從用戶終端讀入數(shù)據(jù) cout:ostream類對象,代表標準輸

5、出,用于向用戶終端寫數(shù)據(jù) cerr:ostream類對象,代表標準錯誤輸出,用于輸出錯誤消息 標準流的默認輸入/輸出設備是控制臺(console)終端,同理: C+還定義了三個輸出流對象 cout、cerr 和 clog。 這三個對象均是ostream_withassign類的對象, 它們均在頭文件ostream.h中被定義,cin 標準輸入流(輸入設備是鍵盤) cout 標準輸出流(輸出設備是顯示器) cerr 標準錯誤輸出流,沒有緩沖,立刻輸出。 clog 輸出日志信息,有緩沖,緩沖區(qū)滿后被輸出。,同理在ostream類中重載了 運算符,編譯器會將 coutxy; 解釋成 (cout.op

6、erator(x) .operator(y);,例 使用cout、cerr和clog #include #include void main( ) double x; coutx; if(x0) cerrx is not a positive number!n; /B return; clogThe root of x is sqrt(x)endl; /C ,在本例中,cout、cerr和clog的作用相同。 而cerr和clog的區(qū)別在于,cerr是非緩沖輸出, 而clog是緩沖輸出。請看例14.3:,缺省的輸入輸出格式 1缺省的(默認的)輸入格式,cin 是緩沖流,當輸入一行結(jié)束按回車(E

7、nter)時, 操作系統(tǒng)將輸入內(nèi)容放入輸入緩沖區(qū), 然后 cin 從輸入緩沖區(qū)提取數(shù)據(jù)。,輸入數(shù)據(jù)時,在缺省的情況下,數(shù)據(jù)之間的分隔符為: 鍵(空格鍵)、鍵(制表鍵)或鍵(回車鍵),這三個鍵通稱為空白字符。,輸入數(shù)據(jù)的類型必須與提取數(shù)據(jù)的變量類型一致。,如:char c1, c2, c3; cinc1c2c3; 程序運行時, 可輸入:abc 也可輸入:ab c 或輸入:a b c 在上述情況下, 三個變量c1、c2和c3獲得值均為 a、b 和 c。 應注意,最后輸入的總是回車鍵。,又如:char s120, s220; cins1s2; 輸入abcd 或輸入abcd 或輸入abcd 結(jié)果字符串

8、s1和s2提取的值均分別為ab和cd。,回車 起兩個作用: 表示一行結(jié)束,可進行提取操作了。 可用它做數(shù)據(jù)分隔符。,7.4 用成員函數(shù)實現(xiàn)輸入輸出 7.4.1 輸出函數(shù) 在ostream類中定義了一些公有成員函數(shù),用于輸出。,ostream /刷新輸出流,例:int i=97; cout.put( char(i) ); char c=*; cout.put( c ); cout.write(abcd, 2);,運行結(jié)果: a*ab,表示輸出一個字符,表示輸出字符串 前 n 個字符,7.4.2 輸入函數(shù) 在istream類中定義了一些公有成員函數(shù),控制輸入。,讀取一個字符, 不跳過空白字符,注意

9、 get( ) 和 getline( ) 的區(qū)別!,讀取一行字符, 不提取n,讀取一行字符, 提取n,例: 讀取字符和字符串 void main( ) char c1, c2, c3; char str180, str2100; cout輸入三個字符:; c1=cin.get( ); cin.get(c2); cin.get(c3); cin.get( ); cout輸入第一行字符串:; cin.get(str1,80); cin.get( ); cout輸入第二行字符串:; cin.getline(str2,80);,運行: abc computer operator,續(xù): cout.put

10、(c1).put(c2).put(c3).put(n); cout.write(str1, 3); cout.write(str2, strlen(str2); cout.put(n); ,輸出結(jié)果: abc comoperator,例7.14 輸入成員函數(shù)的使用 #include #include void main( ) char buf20, max20; int cnum, mc=0; while(cin.getline(buf, 20) / A 提取一行字符,讀取并舍棄行尾標志n cnum = cin.gcount( ); / B 獲取A行的getline( )實際讀取的字符個數(shù) i

11、f(cnummc) mc=cnum; strcpy(max, buf); coutlen=cnum-1,bufendl; / C coutmax len=mc-1,maxendl; / D ,程序的運行狀況是: an apple len=8, an apple very good len=9, very good pear? len=5, pear? ok! len=3, ok! Z /輸入Ctrl+z,表示輸入流結(jié)束。 max len=9, very good,程序功能: 輸入若干行字符(假定每行少于20個字符),輸出每行的字符個數(shù),最后將最長的行及其長度輸出。,7.5 重載插入和提取運算符

12、,istream 和 ostream 類對標準數(shù)據(jù)類型,已定義了 重載運算符: 提取運算符 和 插入運算符 ??搭^文件 istream.h,對用戶新定義的數(shù)據(jù)類型如“復數(shù)”, 能否直接使用 和 進行提取和插入操作呢?,即 如果 Complex c1, c2; 能否 cin c1 ; cout c2;,回答:能! 但必須在定義Complex 類時, 定義重載運算符 和 。,如:int x; cinx; 則自動解釋成 cin.operator(x);,前已述,“文件”指:,(1) 磁盤文件 (2) 設備文件(如鍵盤、顯示器、打印機等),這里特別介紹: 磁盤文件,文本文件中存放的是“文本流”- 一串

13、 ASCII 字符,二進制文件中存放的是“二進制流” - 按內(nèi)存的二進制格式存放(內(nèi)存映象),在“流”中的數(shù)據(jù)是以字節(jié)為單位的。,文件操作是指對文件中的內(nèi)容進行讀寫。,文件流,數(shù)值 12345 在 文本流中和二進制流中的形式:,區(qū)別:,在“流”中的 數(shù)據(jù)是以字節(jié) 為單位的。,7.6.1 文件流類體系,在流類體系中,包含文件流類體系,完成從文件提取數(shù)據(jù),完成向文件插入數(shù)據(jù),完成提取插入操作,完成文件緩沖區(qū)管理,7.6.2 文件的打開和關(guān)閉,文件的使用過程如下: (1) 定義一個文件流對象 (2) 打開文件 (3) 對文件進行讀寫操作 (4) 關(guān)閉文件,1. 定義一個文件流對象 如:ifstrea

14、m infile; /用于與一個輸入文件建立聯(lián)系 ofstream outfile; /用于與一個輸出文件建立聯(lián)系 fstream iofile; /用于與一個輸入輸出文件建立聯(lián)系,使用文件流類, 必須包含頭文件 “fstream.h”,如:infile.open(“myfile1.txt”); /打開 myfile1.txt 用于讀 outfile.open(“myfile2.txt”); /打開 myfile2.txt 用于寫 iofile.open(“myfile3.txt”, ios:in| ios:out); /打開 myfile3.txt 用于讀寫,定義流對象和打開文件可合二為一:

15、,調(diào)用成員函數(shù) 打開文件。,調(diào)用構(gòu)造函數(shù) 打開文件。,2. 打開文件,open( ) 函數(shù)格式,打開文件成員函數(shù) 格式:,void fstream:open(const char *, int, int=filebuf:openprot); void ifstream:open(const char *, int=ios:in, int=filebuf:openprot); void ofstream:open(const char *, int=ios:out, int=filebuf:openprot);,參數(shù) ios: 意義,在 ios 類中,定義了一個公有的無名枚舉成員, 用于定義文件

16、的打開方式。,enum open_mode in=0 x01, /按讀方式打開文件 out=0 x02, /按寫方式打開文件 ate=0 x04, app=0 x08, /按增補(追加)方式打開文件 trunc=0 x10, nocreate=0 x20, noplace=0 x40, binary=0 x80, /打開二進制文件 ;,引用方式為: ios:in ios:out ios:in|ios:binary ios:out |ios:binary 等等,位運算“|”或,組合條件,與 cin 和 cout 的用法相同 如:infile x; outfile y;,3. 對文件進行讀寫操作,

17、在對文件進行讀寫時,我們將文件看成字符流,,隨著文件的讀寫,指針移動。,4. 關(guān)閉文件,void ifstream:close( ); void ofstream:close( ); void fstream:close( );,如:infile.close( ); /切斷與輸入文件 myfile1.txt 的聯(lián)系 outfile.close( ); /切斷與輸出文件 myfile2.txt 的聯(lián)系 iofile.close( ); /切斷與輸入輸出文件 myfile3.txt 的聯(lián)系,文件讀寫完畢,必須關(guān)閉。,關(guān)閉文件成員函數(shù) 格式 :,14.6.3 文本文件的讀寫,例 14.21 將數(shù)值1

18、100及其平方根寫入文件 sqrttable.txt #include #include #include void main( ) double x; ofstream out; / 定義一個輸出流對象 out.open(sqrttable.txt); / 打開文本文件sqrttable.txt for(x=1; x=100; x+) outxtsqrt(x)endl; / 將結(jié)果寫入文件 out.close( ); / 關(guān)閉文件 ,演示并察看結(jié)果文件,例 14.22 編寫一個程序,用于顯示一個文本文件 #include #include #include void main( ) char

19、 filename40, line80; ifstream infile; coutfilename; / A infile.open(filename); / B,if(!infile) coutCan not open file: filenameendl; exit(1); while(infile.getline(line, 80) / 讀入一行 coutlineendl; infile.close( ); / 顯示一行 ,演示,“!”為重載的運算符,7.6.4 二進制文件的讀寫,1. 文件的讀寫操作(成塊讀寫),前三個為讀取操作:將第二個參數(shù)指定的字節(jié)數(shù)讀入到 以第一個參數(shù)為起始地址

20、的內(nèi)存中。,后三個為寫操作:從第一個參數(shù)為起始地址的內(nèi)存開始, 將連續(xù)的第二個參數(shù)指定字節(jié)數(shù)的 內(nèi)容寫到文件中。,7.7 文件的隨機訪問,文件內(nèi)容,讀寫數(shù)據(jù)后自動移動,istream類和ostream類 提供成員函數(shù) , 控制讀寫位置指針的移動, 實現(xiàn)文件的隨機讀寫。,文件剛打開時:,前三個:適用于輸入文件 get 后三個:適用于輸出文件 put,其中: 在 ios 類中定義 typedef long streamoff ; /offset typedef long streampos; /position,所以, 本質(zhì)上, streamoff 和 streampos 就是long 類型,另外

21、,在 ios 類中定義枚舉類型: enum seek_dir beg=0, /文件開始處,使用 ios:beg cur=1, /當前位置, 使用 ios:cur end=2 /文件結(jié)束處,使用 ios:end ;,用于指定移動文件 指針時的參照點。,同理得出后三個函數(shù)的功能!,例 7.29 將Fibonnaci數(shù)列的前40項寫入二進制文件fib.bin中,然后輸出其中的奇數(shù)項,每行輸出5個數(shù)。 #include #include #include #include void main( ) fstream iofile(fib.bin,ios:in|ios:out|ios:binary); i

22、f( !iofile ) coutCan not open file: fib.binendl; exit(1); ,streampos pos = iofile.tellp( ); coutBegin posi=posendl; int f1=1, f2=1; for( int i=0; i20; i+ ) iofile.write(char*),例 7.29 續(xù)2 iofile.seekp(0, ios:beg); /將讀寫位置指針重新定位于文件起始位置 for(i=0; i20; i+) iofile.read(char*) ,二進制文件讀寫,直接寫二進制數(shù)據(jù),記事本看未必正確。,/下面

23、的程序從鍵盤輸入幾個學生的姓名的成績,/ 并以二進制 /文件形式存起來 #include #include using namespace std; class CStudent public: char szName20; int nScore; ;,int main() CStudent s; ofstream OutFile( c:tmpstudents.dat, ios:out|ios:binary); while( cin s.szName s.nScore ) if( stricmp(s.szName,“exit”) = 0) /名字為exit則結(jié)束 break; OutFile.

24、write(char * ) ,輸入: Tom 60 Jack 80 Jane 40 exit 0 則形成的 students.dat 為 72字節(jié),用 記事本打開,呈現(xiàn): Tom 燙燙燙燙燙燙燙燙 Jack 燙燙燙燙燙燙燙蘌 Jane 燙燙燙燙燙燙燙?,/下面的程序?qū)?students.dat 文件的內(nèi)容讀出并顯示 #include #include using namespace std; class CStudent public: char szName20; int nScore; ;,int main() CStudent s; ifstream InFile(“c:tmpstud

25、ents.dat”,ios:in);if(!InFile) cout error endl; return 0; while( InFile.read( (char* ) ,輸出: Tom 60 Jack 80 Jane 40,/下面的程序?qū)?students.dat 文件的Jane的名字改成Mike #include #include using namespace std; class CStudent public: char szName20; int nScore; ;,輸出: Tom 60 Jack 80 Mike 40,int main() CStudent s; fstream

26、 iofile( c:tmpstudents.dat,ios:in|ios:out); if( !iofile) cout error ; return 0; iofile.seekg( 2 * sizeof(s),ios:beg);/定位寫指針到第三個記錄 iofile.write(Mike,strlen(Mike)+1); iofile.seekp(0,ios:beg); /定位讀指針到開頭 while( iofile.read( (char* ) ,7.8 輸入輸出流的出錯處理,ios類中,有一個輸入輸出出錯狀態(tài)字state, 各狀態(tài)位由ios類中定義的枚舉常量來表示: enum io_

27、state goodbit = 0 x00, / 表示狀態(tài)正常 eofbit = 0 x01,/ 表示達到了文件結(jié)尾 failbit = 0 x02,/ 表示I/O操作失敗 badbit = 0 x04 / 表示試圖進行非法操作 ;,在使用流進行輸入輸出操作時,可能會出現(xiàn)一些錯誤。 如當程序中需要輸入整型數(shù)時,在輸入流中卻出現(xiàn)了字符。 C+提供一套類機制,用于檢測輸入輸出流狀態(tài),以發(fā)現(xiàn)錯誤并清除錯誤狀態(tài)。,ios 類提供了幾個內(nèi)聯(lián)函數(shù),用于完成查看狀態(tài)字state中的各個狀態(tài)位、清除狀態(tài)字等工作。 各函數(shù)的功能是: rdstate( ) 返回當前狀態(tài)字 operator!( ) ! 運算符重載

28、,與fail( )函數(shù)功能相同 bad( ) 如果badbit被置位,返回真,否則返回假 clear(int _i=0) 用參數(shù) _i 置新的狀態(tài)字 eof( ) 如果eofbit被置位,返回真,否則返回假 fail( ) 如果badbit或failbit被置位,返回真,否則返回假 good( ) 如果無任何錯誤返回真,否則返回假,例7.31 出錯處理函數(shù)的使用 #include void main( ) double aver=0, score; char temp80; for(int i=0; iscore; while(cin.rdstate( ) / 若有輸入錯誤 cin.clear

29、( ); / 清除出錯狀態(tài),但錯誤輸入依然留在輸入緩沖區(qū)中,cin.getline(temp,80); / 將緩沖區(qū)中的錯誤輸入讀入到temp,丟棄 coutscore; aver+=score; aver/=10; coutaver=“ averendl; ,程序的一次運行狀況可能如下: 10 20 30 a a為非法輸入,請重新輸入! 40 50 60 70 80 90 100 aver=55,異常處理,程序中的錯誤及處理 異常機制 多態(tài)異常處理,編寫健壯、沒有Bug的程序是軟件開發(fā)的首要任務,實際軟件開發(fā)中,花費最大的是測試、發(fā)現(xiàn)和修復Bug。預測和處理錯誤占據(jù)了大多數(shù)代碼。 發(fā)現(xiàn)問題的

30、時間越晚,修復所需付出的代價越高。 盡量避免產(chǎn)生錯誤; 編譯器發(fā)現(xiàn)的語法錯誤; 通過編譯的Bug,首次測試被發(fā)現(xiàn); 偶爾出現(xiàn)的Bug(更難被發(fā)現(xiàn)修復); 程序的脆弱性(異常輸入、內(nèi)存不足等)。,程序中的各種錯誤,-59-,不同類型的Bug,Bug:程序員犯錯引起的程序功能錯誤; 邏輯錯誤:由于程序員對問題以及解決方案的誤解所引起的; 異常:由于不常見但可預見的問題(如內(nèi)存不足或磁盤空間耗盡)引起的。,-60-,處理意外情況,通過設計審核和詳盡測試來發(fā)現(xiàn)邏輯錯誤。 我們無法消除異常,只能為各種可能的異常情況提前做好準備(如內(nèi)存不足、磁盤空間不足)。 出現(xiàn)異常時有以下的處理方式 崩潰 通知用戶并妥

31、善退出 通知用戶,讓用戶嘗試恢復并繼續(xù)執(zhí)行 采取措施,在不影響用戶的情況下繼續(xù)運行,很難做到從所有異常情況下恢復正常,但最起碼不能讓 程序直接崩潰。,-61-,什么是異常,異常是一段代碼遇到異常狀態(tài)后,通知另一段代碼(異常處理代碼)并進行處置的機制。 遇到錯誤的代碼拋出(throw)異常 處理異常的代碼捕獲(catch)異常 異常的處理流程不遵守常規(guī)的代碼執(zhí)行流程,代碼拋出異常后,立即停止執(zhí)行,跳轉(zhuǎn)到異常處理處。,異常處理的基本思想,異常處理的實現(xiàn)機制,拋擲異常的程序段 . throw 表達式; .,捕獲并處理異常的程序段 try 復合語句 catch(異常類型聲明) 復合語句 catch(異

32、常類型聲明) 復合語句 ,異常處理的實現(xiàn)機制,若有異常則通過throw操作創(chuàng)建一個異常對象并拋擲。 將可能拋出異常的程序段嵌在try塊之中??刂仆ㄟ^正常的順序執(zhí)行到達try語句,然后執(zhí)行try塊內(nèi)的保護段。 如果在保護段執(zhí)行期間沒有引起異常,那么跟在try塊后的catch子句就不執(zhí)行。程序從try塊后跟隨的最后一個catch子句后面的語句繼續(xù)執(zhí)行下去。 catch子句按其在try塊后出現(xiàn)的順序被檢查。匹配的catch子句將捕獲并處理異常(或繼續(xù)拋擲異常)。 如果匹配的處理器未找到,則運行函數(shù)terminate將被自動調(diào)用,其缺省功能是調(diào)用abort終止程序。,例12-1處理除零異常,#incl

33、ude int Div(int x,int y); void main() try cout5/2=Div(5,2)endl; cout8/0=Div(8,0)endl; cout7/1=Div(7,1)endl; catch(int) coutexcept of deviding zero.n; coutthat is ok.n; int Div(int x,int y) if(y=0) throw y; return x/y; ,程序運行結(jié)果如下: 5/2=2 except of deviding zero. that is ok.,異常接口聲明,可以在函數(shù)的聲明中列出這個函數(shù)可能拋擲的所

34、有異常類型。 例如:void fun() throw(A,B,C,D); 若無異常接口聲明,則此函數(shù)可以拋擲任何類型的異常。 不拋擲任何類型異常的函數(shù)聲明如下: void fun() throw();,異常處理中的構(gòu)造與析構(gòu),找到一個匹配的catch異常處理后: 初始化參數(shù)。 將從對應的try塊開始到異常被拋擲處之間構(gòu)造(且尚未析構(gòu))的,所有自動對象進行析構(gòu)。 從最后一個catch處理之后開始恢復執(zhí)行。,例12-2 異常處理時的析構(gòu),#include void MyFunc( void ); class Expt public: Expt(); Expt(); const char *Show

35、Reason() const return Expt類異常。; ;,class Demo public: Demo(); Demo(); ; Demo:Demo() cout構(gòu)造 Demo.endl; Demo:Demo() cout析構(gòu) Demo.endl; ,void MyFunc() Demo D; cout在MyFunc()中拋擲Expt類異常。endl; throw Expt(); int main() cout在main函數(shù)中。endl; try cout在try塊中,調(diào)用MyFunc()。 endl; MyFunc(); ,catch( Expt E ) cout在catch異常

36、處理程序中。endl; cout捕獲到Expt類型異常:; coutE.ShowReason()endl; catch( char *str ) cout捕獲到其它的異常:strendl; cout回到main函數(shù)。從這里恢復執(zhí)行。 endl; return 0; ,程序運行時輸出: 在main函數(shù)中。 在try塊中,調(diào)用MyFunc()。 構(gòu)造 Demo. 在MyFunc()中拋擲Expt類異常。 析構(gòu) Demo. 在catch異常處理程序中。 捕獲到Expt類型異常:Expt類異常。 回到main函數(shù)。從這里恢復執(zhí)行。,-73-,處理異常,#include int main() try s

37、td:coutdivide(5,2)std:endl; std:coutdivide(8,0)std:endl; std:coutdivide(7,1)std:endl; catch( double ) std:coutexcept of deviding zero.n; std:coutthat is ok.n; return 0; ,divide函數(shù)中拋出double類型異常, 直接跳轉(zhuǎn)到catch處理塊。,-74-,定義異常類,class XBoundary public: XBoundary() XBoundary() private: ;,在代碼中遇到異常狀態(tài)時,可以拋出自定義的 異

38、常類對象,通常會在異常類中保存異常信息, 示例中做了簡化。,class Array public: Array( int newSize ); Array( int *p, int size ); Array(); Array( const Array,-76-,拋出異常類對象,int ,在代碼中遇到異常狀態(tài)(非法的索引下標), 構(gòu)造并拋出異常對象(XBoundary對象)。 拋出的異常將匹配到類型為XBoundary的 catch塊。,-77-,處理異常,#include int main() Array intArray(20); try for(int i=0; i100; +i) in

39、tArrayi=i; std:cout“OKn”; catch( XBoundary) std:cout“Unable to process your input.n; std:cout“Done.n; return 0; ,下標為20時,超過可訪問范圍,拋出 XBoundary對象,匹配到catch處理 塊,catch塊執(zhí)行完成繼續(xù)執(zhí)行后面 的代碼。,異常傳參及多態(tài)處理,拋出的異??梢允穷惖膶ο?,為了有效處理異常,常見的做法是定義異常類的層次結(jié)構(gòu)。 在catch塊中,可以定義異常對象形參,形參匹配并接收所拋出的異常對象(類似函數(shù)傳參)。通過傳遞引用,配合定義的異常類體系,可以多態(tài)地處理異常。

40、,-78-,-79-,1、識別Array類可能的異常,class Array public: Array(int newSize); Array(int *p,int size); Array(); Array(const Array,數(shù)組大小設置太大 數(shù)組大小設置太小 數(shù)組大小為0 數(shù)組大小為負數(shù) 索引下標非法 ,-80-,2、定義異常類體系,class XBoundary ; class XSize public: XSize(int newSize):size(newSize) XSize() virtual int getSize() return size; virtual void

41、 printError() std:cout Size error. Received: size n; protected: int size; ;,XBoundary處理下標越界的異常。 XSize是分配數(shù)組大小非法異常的基類,定義 getSize和printError虛函數(shù)。,-81-,定義異常類體系,class XTooBig : public XSize public: XTooBig(int size) : XSize(size) virtual void printError() std:cout Too big! Received: ; std:cout XSize:size

42、n; ;,XTooBig是XSize的子類,重寫了基類的虛函數(shù)printError, 以顯式不同的錯誤信息。 XSize:size訪問基類的數(shù)據(jù)成員size。,-82-,定義異常類體系,class XTooSmall : public XSize public: XTooSmall(int size):XSize(size) virtual void printError() std:cout Too small! Received: ; std:cout XSize:size n; ;,XTooSmall是XSize的子類,重寫基類的虛函數(shù)printError, 以顯式不同的錯誤信息。,-8

43、3-,定義異常類體系,class XZero : public XTooSmall public: XZero(int newSize) : XTooSmall(newSize) virtual void printError() std:cout Zero Received: ; std:cout XSize:size n; ;,XZero是XTooSmall的子類,重寫基類的虛函數(shù)printError, 以顯式不同的錯誤信息。 構(gòu)造XZero類對象時,先調(diào)用XSize類的構(gòu)造函數(shù),再調(diào)用 XTooSmall構(gòu)造函數(shù),最后調(diào)用XZero的構(gòu)造函數(shù)。,-84-,定義異常類體系,class XNegative : public XSize public: XNegative(int size):XSize(size) virtual void printError() std:cout Negative! Received: ; std:cout XSize:size n; ;,XNegative是XSize的子類,重寫基類的虛函數(shù)printError, 以顯式不同的錯誤信息。,-85-,3、為數(shù)組類拋出異常,void Array:copyData(int *p, int newSize) size = newSize

溫馨提示

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

評論

0/150

提交評論