運算符重載,異常處理,輸入輸出流庫_第1頁
運算符重載,異常處理,輸入輸出流庫_第2頁
運算符重載,異常處理,輸入輸出流庫_第3頁
運算符重載,異常處理,輸入輸出流庫_第4頁
運算符重載,異常處理,輸入輸出流庫_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、模板模板 l函數(shù)模板 l類模板 函數(shù)模板函數(shù)模板 l函數(shù)模板可以用來創(chuàng)建一個通用功能的函數(shù), 以支持多種不同形參,進一步簡化重載函數(shù)的 函數(shù)體設計。 l聲明方法: template 函數(shù)聲明 函 數(shù) 模 板 求絕對值函數(shù)的模板求絕對值函數(shù)的模板 #include using namespace std; template t abs(t x) return x0?-x:x; void main() int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl; 函 數(shù) 模 板 運行結果:運行結果: 5 5.5 求絕對值函數(shù)的模板分析求絕對值函數(shù)

2、的模板分析 l編譯器從調用abs()時實參的類型,推導 出函數(shù)模板的類型參數(shù)。例如,對于調 用表達式abs(n),由于實參n為int型,所 以推導出模板中類型參數(shù)t為int。 l當類型參數(shù)的含義確定后,編譯器將以 函數(shù)模板為樣板,生成一個函數(shù): int abs(int x) return x0?-x:x; 函 數(shù) 模 板 類模板的作用類模板的作用 使用類模板使用戶可以為類聲明一種模式, 使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參 數(shù)、某些成員函數(shù)的返回值,能取任意類型 (包括基本類型的和用戶自定義類型)。 類 模 板 類模板的聲明類模板的聲明 l類模板: template class 類名 類成

3、員聲明 l如果需要在類模板以外定義其成員函 數(shù),則要采用以下的形式: template 類型名 類名:函數(shù)名(參數(shù)表) 類 模 板 例類模板應用舉例例類模板應用舉例 #include #include using namespace std; / 結構體student struct student int id; /學號 float gpa; /平均分 ; 類 模 板 template /類模板:實現(xiàn)對任意類型數(shù)據(jù)進行存取 class store private: t item; / 用于存放任意類型的數(shù)據(jù) int havevalue; / 用于標記item是否已被存入內容 public: s

4、tore(void); / 默認形式(無形參)的構造函數(shù) t getelem(void); /提取數(shù)據(jù)函數(shù) void putelem(t x); /存入數(shù)據(jù)函數(shù) ; / 默認形式構造函數(shù)的實現(xiàn) template store:store(void): havevalue(0) 8 template / 提取數(shù)據(jù)函數(shù)的實現(xiàn) t store:getelem(void) / 如果試圖提取未初始化的數(shù)據(jù),則終止程序 if (havevalue = 0) cout no item present! endl; exit(1); return item; / 返回item中存放的數(shù)據(jù) template /

5、存入數(shù)據(jù)函數(shù)的實現(xiàn) void store:putelem(t x) havevalue+; / 將havevalue 置為 true,表示item中已存 入數(shù)值 item = x; / 將x值存入item 9 void main(void) student g= 1000, 23; store s1, s2; store s3; store d; s1.putelem(3); s2.putelem(-7); cout s1.getelem() s2.getelem() endl; s3.putelem(g); cout the student id is s3.getelem().id end

6、l; cout retrieving object d ; cout d.getelem() endl; /輸出對象d的數(shù)據(jù)成員 / 由于d未經初始化,在執(zhí)行函數(shù)d.getelement()時出錯 10 問題舉例問題舉例復數(shù)的運算復數(shù)的運算 class complex/復數(shù)類聲明 public: complex(double r=0.0,double i=0.0) /構造函數(shù) real=r; imag=i; void display();/顯示復數(shù)的值 private: double real; double imag; ; 運算符重載 問題舉例問題舉例復數(shù)的運算復數(shù)的運算 l用“+”、“-”

7、能夠實現(xiàn)復數(shù)的加減運算 嗎? l實現(xiàn)復數(shù)加減運算的方法 重載“+”、“-”運算符 運算符重載 運算符重載的實質運算符重載的實質 l運算符重載是對已有的運算符賦予多重含義 l必要性 lc+中預定義的運算符其運算對象只能是基本數(shù)據(jù)類 型,而不適用于用戶自定義類型(如類) l實現(xiàn)機制 l將指定的運算表達式轉化為對運算符函數(shù)的調用,運 算對象轉化為運算符函數(shù)的實參。 l編譯系統(tǒng)對重載運算符的選擇,遵循函數(shù)重載的選擇 原則。 運算符重載 運算符重載 規(guī)則和限制規(guī)則和限制 l可以重載c+中除下列運算符外的所有 運算符: . .* : ?: l只能重載c+語言中已有的運算符,不 可臆造新的。 l不改變原運算

8、符的優(yōu)先級和結合性。 l不能改變操作數(shù)個數(shù)。 l經重載的運算符,其操作數(shù)中至少應該 有一個是自定義類型。 兩種形式兩種形式 l重載為類成員函數(shù)。 l重載為友元函數(shù)。 運算符重載 運算符函數(shù)運算符函數(shù) l聲明形式 函數(shù)類型 operator 運算符(形參) . l重載為類成員函數(shù)時 參數(shù)個數(shù)=原操作數(shù)個數(shù)-1(后置+、- -除外) l重載為友元函數(shù)時 參數(shù)個數(shù)=原操作數(shù)個 數(shù),且至少應該有一個自定義類型的形參。 運算符重載 運算符成員函數(shù)的設計運算符成員函數(shù)的設計 l雙目運算符 b l如果要重載 b 為類成員函數(shù),使之能夠實現(xiàn)表 達式 oprd1 b oprd2,其中 oprd1 為a 類對象,

9、 則 b 應被重載為 a 類的成員函數(shù),形參類型應 該是 oprd2 所屬的類型。 l經重載后,表達式 oprd1 b oprd2 相當于 oprd1.operator b(oprd2) 運算符重載 運算符重載 例例 8.1 將“+”、“-”運算重載為復數(shù)類 的成員函數(shù)。 l 規(guī)則: l實部和虛部分別相加減。實部和虛部分別相加減。 l 操作數(shù): l兩個操作數(shù)都是復數(shù)類的對象。兩個操作數(shù)都是復數(shù)類的對象。 #include using namespace std; class complex/復數(shù)類聲明 public: /外部接口 complex(double r=0.0,double i=0.

10、0)real=r;imag=i; /構造函數(shù) complex operator + (complex c2); /+重載為成員函數(shù) complex operator - (complex c2); /-重載為成員函數(shù) void display();/輸出復數(shù) private:/私有數(shù)據(jù)成員 double real;/復數(shù)實部 double imag;/復數(shù)虛部 ; 19 complex complex: operator +(complex c2) /重載函數(shù)實現(xiàn) complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return compl

11、ex(c.real,c.imag); 20 complex complex: operator -(complex c2) /重載函數(shù)實現(xiàn) complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); 21 void complex:display() cout(real,imag)endl; void main() /主函數(shù) complex c1(5,4),c2(2,10),c3; /聲明復數(shù)類的對象 coutc1=; c1.display(); coutc2=; c2.display(

12、); c3=c1-c2; /使用重載運算符完成復數(shù)減法 coutc3=c1-c2=; c3.display(); c3=c1+c2; /使用重載運算符完成復數(shù)加法 coutc3=c1+c2=; c3.display(); 22 程序輸出的結果為: c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14) 23 運算符成員函數(shù)的設計運算符成員函數(shù)的設計 l前置單目運算符 u l如果要重載 u 為類成員函數(shù),使之能夠實現(xiàn) 表達式 u oprd,其中 oprd 為a類對象,則 u 應被重載為 a 類的成員函數(shù),無形參。 l經重載后, 表達式 u oprd

13、相當于 oprd.operator u() 運算符重載 運算符成員函數(shù)的設計運算符成員函數(shù)的設計 l后置單目運算符 +和- l如果要重載 +或-為類成員函數(shù),使之能夠 實現(xiàn)表達式 oprd+ 或 oprd- ,其中 oprd 為a類對象,則 +或- 應被重載為 a 類的 成員函數(shù),且具有一個 int 類型形參。 l經重載后,表達式 oprd+ 相當于 oprd.operator +(0) 運算符重載 例例8.2 l運算符前置+和后置+重載為時鐘類的成員 函數(shù)。 l前置單目運算符,重載函數(shù)沒有形參,對于后 置單目運算符,重載函數(shù)需要有一個整型形參。 l操作數(shù)是時鐘類的對象。 l實現(xiàn)時間增加1秒鐘

14、。 運算符重載 /8_2.cpp #include using namespace std; class clock/時鐘類聲明 public:/外部接口 clock(int newh=0, int newm=0, int news=0); void showtime(); clock /前置單目運算符重載 clock operator +(int); /后置單目運算符重載 private:/私有數(shù)據(jù)成員 int hour,minute,second; ; 27 clock if(second=60) second=second-60; minute+; if(minute=60) minut

15、e=minute-60; hour+; hour=hour%24; return *this; 28 /后置單目運算符重載 clock clock:operator +(int) /注意形參表中的整型參數(shù) clock old=*this; +(*this); return old; 29 /其它成員函數(shù)的實現(xiàn)略 void main() clock myclock(23,59,59); coutfirst time output:; myclock.showtime(); coutshow myclock+:; (myclock+).showtime(); coutshow +myclock:;

16、 (+myclock).showtime(); 30 程序運行結果為: first time output: 23:59:59 show myclock+: 23:59:59 show +myclock: 0:0:1 31 異常處理的基本思想異常處理的基本思想 函數(shù)f( )捕獲并處理異 常 函數(shù)h( ) 引發(fā)異常 函數(shù)g( ) 調用者 異常傳播方向調用關系 異常處理的實現(xiàn)異常處理的實現(xiàn) l拋擲異常的程序段 . throw 表達式; . l捕獲并處理異常的程序 段 try 復合語句 catch(異常類型聲明) 復合語句 catch(異常類型聲明) 復合語句 控制通過正常的順 序執(zhí)行到達try語句

17、, 然后執(zhí)行try塊內的 保護段。 如果在保護段執(zhí)行 期間沒有引起異常, 那么跟在try塊后的 catch子句就不執(zhí)行。 程序從try塊后跟隨 的最后一個catch子 句后面的語句繼續(xù) 執(zhí)行下去。 若有異常則從通過 throw操作創(chuàng)建一個 異常對象并拋擲。 catch子句按其在try 塊后出現(xiàn)的順序被檢 查。匹配的catch子句 將捕獲并處理異常 (或繼續(xù)拋擲異常)。 如果匹配的處理器未 找到,則運行函數(shù) terminate將被自動調 用,其缺省功能是調 用abort終止程序。 例例12-1 處理除零異常處理除零異常 #include int div(int x,int y); void ma

18、in( ) 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; 程序運行結果如下:程序運行結果如下: 5/2=2 except of deviding zero. that is ok. 異常接口聲明異常接口聲明 l可以在函數(shù)的聲明中列出這個函數(shù)可能拋擲的 所有異常類型。 l例如: void

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

20、 ); const char *showreason( ) const return expt類異常。; ; class demo public: demo( ); demo( ); ; demo:demo( ) cout 構造 demo. endl; demo:demo( ) cout 析構 demo. endl; void myfunc( ) demo d; cout 在myfunc( )中拋擲expt類異常。 endl; throw expt( ); int main( ) cout 在main函數(shù)中。 endl; try cout 在try塊中,調用myfunc( )。 endl; m

21、yfunc( ); catch( expt e ) cout 在catch異常處理程序中。 endl; cout 捕獲到expt類型異常:; cout e.showreason( ) endl; catch( char *str ) cout 捕獲到其它的異常: str endl; cout 回到main函數(shù)。從這里恢復執(zhí)行。 open(filename,iosmodepmyfile-open(filename,iosmode); ); / /打開文件,使流對象與文件建立聯(lián)系打開文件,使流對象與文件建立聯(lián)系 輸出流對象輸出流對象 l在一個由文件指示符標識的打開文 件基礎上構造一個ofstrea

22、m對象。 int fd = open(filename,dosmodeint fd = open(filename,dosmode);); ofstreamofstream myfile1(fd); myfile1(fd); / buffered mode(default) / buffered mode(default) ofstream myfile2(fd,null,0);ofstream myfile2(fd,null,0); / unbuffered / unbuffered mode mode 插入運算符(插入運算符() l插入()運算符是所有標準c+數(shù)據(jù)類型預先 設計的。 l用于

23、傳送字節(jié)到一個輸出流對象。 控制輸出格式控制輸出格式 l控制輸出寬度 l為了調整輸出,可以通過在流中放入setw操縱符或 調用width成員函數(shù)為每個項指定輸出寬度。 例例11-1 使用使用width控制輸出寬度控制輸出寬度 #include void main( ) double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout valuesi n; 輸出結果是: 1.23 35.36 653.7 4358.24 #include void main( ) double values = 1.

24、23,35.36,653.7,4358.24; for(int i=0; i4; i+) cout.width(10); cout.fill(*); cout valuesi n; 輸出結果如下: *1.23 *35.36 *653.7 *4358.24 例例11-2 使用使用setw指定寬度指定寬度 #include #include void main( ) double values = 1.23,35.36,653.7,4358.24; char *names = zoot, jimmy, al, stan; for (int i=0;i4;i+) cout setw(6) names

25、i setw(10) valuesi endl; 輸出流 運行結果如下: zoot 1.23 jimmy 35.36 al 653.7 stan 4358.24 例例11-3 設置對齊方式設置對齊方式 #include #include void main( ) double values = 1.23,35.36,653.7,4358.24; char *names = zoot, jimmy, al, stan; for (int i=0;i4;i+) cout setiosflags(ios:left) setw(6) namesi resetiosflags(ios:left) set

26、w(10) valuesi endl; 輸出結果如下: zoot 1.23 jimmy 35.36 al 653.7 stan 4358.24 例例11-4 控制輸出精度控制輸出精度 #include #include void main( ) double values = 1.23,35.36,653.7,4358.24; char *names = zoot, jimmy, al, stan; cout setiosflags(ios:scientific); for (int i=0;i4;i+) cout setiosflags(ios:left) setw(6) namesi re

27、setiosflags(ios:left) setw(10) setprecision(1) valuesi endl; 該程序的輸出結果如下: zoot 1 jimmy 4e+001 al 7e+002 stan 4e+003 進制進制 dec、oct和hex操縱符設置輸入和輸出的缺省進 制。 輸出文件流成員函數(shù)輸出文件流成員函數(shù) l輸出流成員函數(shù)有三種類型: l與操縱符等價的成員函數(shù)。 l執(zhí)行非格式化寫操作的成員函數(shù)。 l其它修改流狀態(tài)且不同于操縱符或插入運算符的成 員函數(shù)。 輸出文件流成員函數(shù)輸出文件流成員函數(shù) lopen函數(shù) 把流與一個特定的磁盤文件關聯(lián)起來。 需要指定打開模式。 lp

28、ut函數(shù) 把一個字符寫到輸出流中。 lwrite函數(shù) 把內存中的一塊內容寫到一個輸出文件流中 lseekp和tellp函數(shù) 操作文件流的內部指針 lclose函數(shù) 關閉與一個輸出文件流關聯(lián)的磁盤文件 l錯誤處理函數(shù) 在寫到一個流時進行錯誤處理 例例11-5 向文件輸出向文件輸出 #include struct date int mo,da,yr; ; void main( ) date dt = 6,10,92; ofstream tfile(date.dat,ios:binary); tfile.write(char *) 二進制輸出文件二進制輸出文件 l以通常方式構造一個流,然后使用set

29、mode成 員函數(shù),在文件打開后改變模式。 l使用ofstream構造函數(shù)中的模式參量指定二進 制輸出模式 l使用二進制操作符代替setmode成員函數(shù):ofs ) l提取運算符()對于所有標準c+數(shù)據(jù)類型都 是預先設計好的。 l是從一個輸入流對象獲取字節(jié)最容易的方法。 lios類中的很多操縱符都可以應用于輸入流。 但是只有少數(shù)幾個對輸入流對象具有實際影響, 其中最重要的是進制操縱符dec、oct和hex。 輸入流成員函數(shù)輸入流成員函數(shù) lopen函數(shù)把該流與一個特定磁盤文件相關聯(lián)。 lget函數(shù)的功能與提取運算符()很相像,主要 的不同點是get函數(shù)在讀入數(shù)據(jù)時包括空白字符。 (第6章介紹過) lgetline的功能是從輸入流中讀取多個字符,并且 允許指定輸入終止字符,讀取完成后,從讀取的 內容中刪除終止字符。 (第6章介紹過) 輸入流成員函數(shù)輸入流成員函數(shù) lrea

溫馨提示

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

評論

0/150

提交評論