




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第10章章 模板和異常處理模板和異常處理目錄目錄10.1 函數模板函數模板10.1.1 函數模板的定義及說明函數模板的定義及說明10.1.2 函數模板的簡單應用函數模板的簡單應用10.2 類模板類模板10.2.1類模板的定義及說明類模板的定義及說明10.2.2模板類及簡單應用模板類及簡單應用10.2.3類模板的派生與繼承類模板的派生與繼承1、模板類繼承非模板類、模板類繼承非模板類2、非模板類繼承模板類、非模板類繼承模板類3、類模板的派生、類模板的派生目錄目錄10.3 異常處理異常處理10.3.1 異常處理的基本思想異常處理的基本思想10.3.2 異常處理的實現異常處理的實現1、throw語句
2、語句2、trycatch語句語句3、trycatch語句的嵌套語句的嵌套4、相關的幾點說明、相關的幾點說明 在實際C+程序設計過程中,往往會發(fā)現這樣的現象:程序中所定義的兩個或多個函數的函數體完全一樣,所不同的只是它們的參數類型不一樣。引言引言求兩個數的最小值求兩個數的最小值 int MIN(int x, int y) retrun (xy) ? x :y; float MIN(float x, float y) return (xy) ? x :y; double MIN(double x, double y) return (xy) ? x :y; 三個函數函數體相同,唯一不同的是它們的形
3、參不一三個函數函數體相同,唯一不同的是它們的形參不一樣,我們可以用樣,我們可以用重載重載多態(tài)實現,但是很繁瑣,也容易多態(tài)實現,但是很繁瑣,也容易出錯。出錯。求兩個數的最小值求兩個數的最小值如有下面調用語句:char a, b;MIN(a, b);?問題:問題:用戶因為沒有定義char類型的重載函數,程序將會產生錯誤 !為解決上述問題C+系統(tǒng)引入模板機制 。解決方法解決方法模板:是實現代碼重用機制的一種工具,它可以實現類型參數化,即把類型定義為參數, 從而實現了真正的代碼可重用性。 模板(Templates)可以生成通用的函數,這些函數能夠接受任意數據類型的參數,可返回任意類型的值,而不需要對所
4、有可能的數據類型進行函數重載時的匹配檢查。 模板及種類模板及種類根據所處理的數據類型說明作為參數的類和函數,分別稱為類模板和函數模板。 10.1 函數模板函數模板 函數模板的定義形式如下: template 返回值類型 函數名(形參表) 函數體 關鍵字關鍵字參數表關參數表關鍵字或者鍵字或者用用class10.1.1 函數模板的定義及說明函數模板的定義及說明1、template為定義模板的關鍵字,用于指定在實際調用時可以進行替換的參數類型名,其格式為: 這里的class為關鍵字,T1、T2、Tn為用戶自己命名的以后需要替換的類型名。定義說明定義說明2、 “函數值類型”是模板函數的返回值類型,既可
5、以是已有的類型名,如int、double等,也可以是在中給出的類型名,如T1、T2等。同樣,“參數表”和“函數體”中所使用的數據類型名既可以是已有的類型名,也可以是在中給出的類型名。舉例舉例#include template T GetMax (T a, T b) return (ab? a: b); void main () int i=5,j=6,K; float m=6.5, n=5.8,L; K=GetMax(i, j); L=GetMax(m, n); coutKendl; coutLendl; 函數模板函數模板定義定義函數模板函數模板的應用的應用 1在主函數main( ) 中,模板
6、函數GetMax()調用了兩次,兩次調用的參數類型是不一致的,而對于GetMax()函數的定義,并沒有在括號中指明具體數據類型的,但把它定義成函數模板。因此,編譯器將會自動決定每一個調用需要什么數據類型。 舉例說明舉例說明2模板函數只包括一種數據類型 (class T)時,它的兩個參數都要求是同一種數據類型,當使用兩個不同類型的參數來調用它,系統(tǒng)將產生錯誤。如:int i;long j; k = GetMax (i, j);上面的調用就是錯誤的,因為函數等待的是接收兩個相同類型的參數。 3系統(tǒng)允許模板函數接受兩種或兩種以上不同類型的數據,例如: template T GetMin (T a,
7、U b) return (ab? a: b); 本例中,模板函數 GetMin() 接受兩個不同類型的參數,兩個不同的類型參數的區(qū)分是通過T和U來進行的,結果將返回一個與第一個參數同類型的數據。在這種定義方式下,還可以通過以下方式來調用該函數:int i, j; long k; i = GetMin (j, k); 或者,簡單的用下面形式來實現調用: i = GetMin (j, k);舉例說明舉例說明4在定義時要注意:在template語句與函數模板定義語句之間不允許有別的語句。如下面的聲明是錯誤的:templateint i;T min(T x,T y) 函數體舉例說明舉例說明5模板函數類
8、似于重載函數,但兩者有很大區(qū)別:函數重載時,每個函數體內可以執(zhí)行不同的動作,即函數體功能可以定義不同。但同一個函數模板實例化后的模板函數都必須執(zhí)行相同的動作,即只能執(zhí)行的該模板函數的函數體。 舉例說明舉例說明6、函數模板中的模板形參可實例化為各種類型,當實例化模板形參的各模板實參之間不完全一致時,就可能發(fā)生錯誤,在C+中,函數模板與同名的非模板函數重載時,應遵循下列調用原則:舉例說明舉例說明7、模板參數也可以設置默認(缺?。┲?,類似于為函數參數設置默認值一樣,如:template / 一個typename 參數template / 兩個class 參數。template / 一個class 和
9、一個整數。template / 有一個默認值。template / 參數為一個函數。舉例說明舉例說明(1)首先尋找一個與參數完全匹配的函數,若找到就調用它。若參數完全匹配的函數多于一個,則這個調用也將是一個錯誤的調用。(2)其次尋找一個函數模板,若找到就將其實例化生成一個匹配的模板函數并調用它。(3)若上面兩條都失敗,則使用函數重載的方法,通過類型轉換產生參數匹配,若找到就調用它。(4)若上面三條都失敗,即沒有找都匹配的函數,則這個調用是一個錯誤的調用,系統(tǒng)將產生報錯。在定義函數模板之后,用戶可以直接用實參代替函數模板定義中的參數,來實現對該函數的調用。具體形式如下所示:函數名;10.1.2
10、函數模板的簡單應用函數模板的簡單應用系統(tǒng)處理:編譯器將根據用戶給出的實參類型,來生成相應的重載函數,該生成的重載函數稱為模板函數,是一個實實在在的函數,可以執(zhí)行。 【例例10-1】試編程實現利用函數模板方式設計一個函數sort,實現對整數序列和字符序列從小到大的排序。舉例舉例分析:要實現在一個函數中對整數序列和字符序列進行排序,則要用到函數模板,進行對不同數據的處理。在定義時要注意函數模板的定義格式??紤]到數據序列的存儲,則函數sort應有兩個參數,一個是數據序列的首地址,一個應是數據序列的長度。要進行排序,則要用到排序算法進行實現。 #include#includetemplate/對函數模
11、板的定義void sort(T a,int n) /注意函數模板中參數的定義形式int i,j;cout原系列為:; for(i=0;in;i+) coutait;coutendl;for(i=0;in;i+)for(j=i+1;jaj) T k=ai; ai=aj; aj=k;cout排序后系列為:;for(i=0;in;i+)coutait;coutendl;void main() int b5=7,5,2,8,1; char c=xkdwzeopb; sort(b,5);/函數模板的調用,注意數據類型為int sort(c,strlen(c); /函數模板的調用,注意數據類型為char運
12、行結果如下:運行結果如下:原序列為:75281排序后的序列為:1 25 78原序列為:x k d w z e o p b 排序后的序列為:b d e k o p w x z 類也可以定義為類模板(class templates),這樣就可使得一個類有基于通用類型的成員,而不需要在類生成的時候定義具體的數據類型,例如:template class AA T x, y;public: AA (T a, T b) x=a; y=b; ;10.2 類類模板模板類模板定義關鍵字,也類模板定義關鍵字,也可用關鍵字可用關鍵字typename類模板的一般定義形式: Template class 類名 /類定義
13、 ;10.2.1 類模板的定義及說明類模板的定義及說明模板參數可以是一個,模板參數可以是一個,也可以是多個。也可以是多個。定義說明定義說明1、定義中的template是聲明各模板的關鍵字,表示聲明一個模板,模板參數可以是一個,也可以是多個。2、參數類型說明關鍵字typename也可以用class代替3、類模板定義中,凡要采用標準數據類型的數據成員、成員函數的參數或返回類型的前面都要加上類型標識符。定義說明定義說明4、如果類中的成員函數要在類的聲明之外定義,則它必須是模板函數。其定義形式為:template函數返回類型 類名:函數名(數據類型參數標識符 形參1,數據類型參數標識符 形參n) 函數
14、體5、類模板使類中的一些數據成員和成員函數的參數或返回值可以取任意的數據類型。類模板不是一個具體的類,它代表著一族類,是這一族類的統(tǒng)一模式。使用類模板就是要將它實例化為具體的類?!纠?0-2】定義一個包含兩個私有數據、一個構造函數和一個輸出函數的類模板。舉例舉例template /A行class AA private: T1 i; /B行 T2 j; public:AA(T1 a,T2 b);void print( );template /C行AA:AA(T1 a, T2 b):I(a), J(b) /D行template void AA:print( )couti=i, j=jendl;
15、實現類定義如下:實現類定義如下:定義模板的格式定義模板的格式定義了私有數據定義了私有數據:i1、程序中的A行為定義模板的格式,注意語句后面不能加上分號,因為它要和下面的類定義構成一個整體。2、程序中的B行語句是定義了一個類的私有數據i;3、程序中的C行和D行合在一起構成了在類的外部定義AA類的構造函數AA,注意定義形式;4、關鍵字typename,也可以使用用關鍵字class代替。說明說明模板類是一個實實在在的類,即有確定類型的類??梢岳妙惸0瀹a生很多的不同模板類,如,利用10-2例中的類模板AA,可以生成以下的模板類:AA; /第一個參數是int,第二個參數也是int。AA; /第一個參數
16、是int, 第二個參數是char。AAAA, char /第一個參數具有AA類的類型,第二個參數是char。AA /第一個參數指向int的指針類型,第二個參數是int。 10.2.2 模板類及簡單應用模板類及簡單應用將類模板的模板參數實例化后生成的具體的類,就是模板類。將類模板的模板參數實例化后生成的具體的類,就是模板類。 定義形式:類名類名 對象名對象名1,對象名,對象名2,對象名,對象名n;其中:1、類名為實例化的模板類,對象名1,對象名2等為定義類的對象名稱。2、系統(tǒng)將會把格式中的:類名中的“類型實參表”全部替換成對應的實際類型,從而創(chuàng)建一個具體的模板類,并生成該模板類(具體類)的對象。
17、 10.2.2 模板類及簡單應用模板類及簡單應用有了確定類型的模板類后,就能利用它來創(chuàng)建類的實有了確定類型的模板類后,就能利用它來創(chuàng)建類的實例例-即產生類的對象。即產生類的對象?!纠?0-3】定義10-2例中的模板類及生成對象,并在主函數中完成對相關成員函數的調用測試。 舉例舉例分析:在主函數中通過定義模板類并生成對象,然后利用對象來調用成員函數來完成對定義類的測試 。void main()AAa1(3,5); /實例化模板類并成了a1對象。a1.print(); /a1對象調用了成員函數print。AAa2(4,a);a2.print();AAa3(2.9,10);a3.print();實
18、現類定義如下:實現類定義如下:運行結果:運行結果:i3,j5i4,jai2.9,j10【例例10-4】試設計一個復數類模板Complex,其私有數據成員real和image的類型未知且不一定相同,具體相關函數要求如下:(1)構造函數;要求:設置缺省值0。(2)輸出函數show;要求按復數的標準形式輸出。(3)成員函數add;功能:求兩個復數的和。(4)友元函數重載運算符-;功能實現求兩個復數的差。(5)要求在主函數中定義模板類對象,分別以int和double實例化類型參數來測試復數類模板。舉例舉例1、從該復數類模板Complex的兩個私有數據成員real和image的類型未知且不一定相同可知,
19、模板有兩個不相同的參數,應設置如下模板參數:template;在定義構造函數時要求要有缺省參數,所以構造函數申明應為:Complex(T1 x=0,T2 y=0);2、對輸出函數show的定義應考慮到復數的輸出形式:real+image i;的形式,在輸出時,應考慮到如果image的值為正數時,輸出為:real+image i;負數時輸出為:real-image i;當為0時輸出為:real。因此,要先對image的值進行判斷,再決定輸出形式;分析分析3、對add函數,應考慮到其參數類型也應該是一個對象,因此,在定義該對象時,要注意對定義的類模板進行實例化,形式為:Complex add(Co
20、mplex a);注意函數的返回值也應為類的對象。4、對于友元函數重載運算符-,要注意參數表也應為兩個參數,并且這兩個參數也進行實例化,如:friend Complex operator-(Complex b, Complex c);5、在類的外部定義成員函數時,要注意類模板的成員函數定義與普通類成員函數定義的區(qū)別,特別是注意在函數體內定義對象時,也要注意對類模板進行實例化,否則系統(tǒng)將出錯,如:Complex t1; 分析分析#includetemplateclass Complex T1 real; T2 image;public: Complex(T1 x=0,T2 y=0); Compl
21、ex add(Complex a); friend Complex operator-(Complex b, Complex c); void show();程序如下:程序如下:templateComplex:Complex(T1 x,T2 y)real=x;image=y;templateComplex Complex:add(Complex a)Complex t1;t1.real=real+a.real;t1.image=image+a.image;return t1;templateComplex operator-(Complex b, Complex c)Complex t2;t2
22、.real=b.real-c.real;t2.image=b.image-c.image;return t2;templatevoid Complex:show()cout0)cout+imageiendl;else if(image0) cout-imageiendl;類模板作為一種特殊的類,也可以有自己的派生類,與普通類的派生一樣,類模板的派生也有公有派生、私有派生和保護派生方式,相關類成員的訪問方法與原則和普通類的繼承與派生是一致,如:派生類不能訪問基類的私有成員等,并且派生的語法格式普通類也是相似的。但要注意以下兩點:(1)在聲明模板繼承之前,必須重新聲明該模板,否則系統(tǒng)將產生錯誤。(
23、2)類模板的成員函數不能聲明為虛函數。10.2.2 類模板的派生與繼承類模板的派生與繼承void main()Complexi(2,3),k;Complexj(4,5.2),m(1,2.6),n;k=i.add(i);k.show();n=j-m;n.show();問題:問題:如何利用成員函數的方式重載如何利用成員函數的方式重載“+”,實現,實現add函數的功能?函數的功能?在派生與繼承的過程中,基類和派生類都有可能是模板類或者是經過實例化的模板類。常見有以下三種:1、模板類繼承非模板類:、模板類繼承非模板類:基類為非模板類,派生類為模板類。其作用可以實現用一個非模板類,為一組模板提供一種共同
24、實現的方法。2、非模板類繼承模板類:非模板類繼承模板類:基類為模板類,派生類為非模板類。3、類模板的派生:類模板的派生:基類為類模板,派生類也為類模板。與非模板類繼承模板類不同的是派生類(類模板)將繼承基類(模板類)的所有實例,而不是一個實例 10.2.2 類模板的派生與繼承類模板的派生與繼承基類為非模板類,派生類為模板類。其作用可以實現用一個非模板類,為一組模板提供一種共同實現的方法。1、模板類繼承非模板類模板類繼承非模板類 【例例10-5】試設計一個非模板類Point類,然后設計一個繼承Point類的類模板Line,利用成員函數求Line類實例化為int, double類型時的長度,并進行
25、相應的輸出和測試。 1、首先定義一個非模板類point,其定義形式為普通類的定義,但需要注意的是:兩個數據成員如果訪問權限為private時,要考慮到在派生類中的訪問,所以在point類中要定義兩個公有函數getx(),gety(),來實現對基類私有數據在派生類中的訪問。2、類模板Line的定義,要注意定義形式,templateclass Line:public Point,在成員函數Length()中。3、因為要求出兩個點的長度,所以要利用求平方根數學函數,要注意頭文件的包含#include; 4、在主函數中定義Line類的對象時要注意:首先要對進行模板類的實例化形式如:Linem(1,2,
26、3,4);在定義好對象后,其成員函數的訪問同普通類是一樣的。 分析分析#include#includeclass Pointint x1;int y1;public:Point(int i=0,int j=0)x1=I;y1=j;void show( )cout”起點為:(“x1”,”y1”)”t”; int getx( )return x1;int gety( )return y1; templateclass Line:public PointT x2,y2;public:Line(T c1,T c2,int c3,int c4 ):Point(c3,c4) x2=c1; y2=c2;T
27、Length() T k=sqrt(x2-getx()*(x2-getx()+(y2-gety()*(y2-gety(); return k;void show()Point:show( );cout”終點為:(“x2”,”y2”)”endl;void main()Linem(1,2,3,4);m.show( );cout”兩點的距離為:”m.Length()endl;Linen(2.4,5.2,1,8);n.show( );cout”兩點的距離為:”n.Length()endl;運行結果運行結果:起點為:(3,4) 終點為:(1,2)兩點的距離為:2起點為:(1,8) 終點為:(2.4,5.
28、2)兩點的距離為:3.1305 基類為模板類,派生類為非模板類。因為類模板能產生不同實例,所以非模板類只能繼承一個確定的模板類,既繼承一個實例。2、非模板類繼承模板類非模板類繼承模板類 【例例10-6】試設計一個模板類Point類,然后設計一個繼承Point類的Line類,用來輸出兩個點的值。并在主函數中進行測試。 。 1、先定義模板類Point,注意定義時和普通類定義的區(qū)別。2、定義派生類Line時,要注意定義時與普通派生定義的區(qū)別,模板類首先要實例化才能進行派生,形式如: class Line: public Point;在派生類的構造函數定義時和說明基類的構造調用時,也要注意基類的實例化
29、,形式如下所示:Line(int a,int b,int c,int d):Point(c,d)在進行基類成員函數調用時,也要注意對基類(模板類)的實例化,形式如下所示:Point:show( );模板類實例化后,可以直接生成派生類 。分析分析#includetemplateclass PointT x1,y1;public:Point(T m,T n)x1=m;y1=n;void show() coutx1=x1,y1=y1endl; ;class Line:public Pointint x2,y2;public:Line(int a,int b,int c,int d):Point(c,
30、d)x2=a;y2=b;void show()Point:show();coutx2=x2,y2=y2endl;void main()Pointp1(1.1,2.2);p1.show();Line ab(1,2,3,4);ab.show();運行結果:運行結果:x1=1.1,y1=2.2x1=3,y1=4x2=1,y2=2 基類為類模板,派生類也為類模板。與非模板類繼承模板類不同的是派生類(類模板)將繼承基類(模板類)的所有實例,而不是一個實例。 3、類模板的派生類模板的派生【例例10-7】試設計一個模板類Point類,然后設計一個繼承Point類的Line類模板,作用是用來輸出兩個點的值,并
31、在主函數中進行測試。1、先定義模板類Point,注意定義時和普通類定義的區(qū)別。2、在定義派生類模板Line時,一定要對模板類要先進行實例化才能夠進行派生,形式如: templateclass Line: public Point 在類模板(派生類)的構造函數定義時,要注意定義時對基類的實例化。形式如下所示:Line(T a,T b,T c,T d):Point(c, d); 在進行基類成員函數調用時,應首先對基類(模板類)的實例化,形式如下所示:Point:show( ); 3、實例化后,在主函數中定義派生類對象時,也要注意對對象的實例化,形式如下所示:Lineb(1,2,3,4); 分析分析
32、#includetemplateclass PointT x1,y1;public:Point(T m,T n)x1=m;y1=n;void show() coutx1=x1,y1=y1endl; ;templateclass Line:public PointT x2,y2;public:Line(T a,T b,T c,T d):Point(c,d)x2=a;y2=b;void show()Point:show();coutx2=x2,y2=y2endl; void main()Pointa(1.1,2.2);a.show();Lineb(1,2,3,4);b.show();Linec(1
33、.1,2.2,3.3,4.4);c.show();運行結果:運行結果:x1=1.1,y1=2.2x1=3,y1=4x2=1,y2=2x1=3.3,y1=4.4x2=1.1,y2=2.2程序中的錯誤通常包括三類:語法錯誤、邏輯錯誤和運行異常。1、語法錯誤:是指程序中源代碼的書寫不符合語言的語法規(guī)范。2、邏輯錯誤(或語義錯誤):是指因程序設計不當而造成程序不能完成預期的功能。 3、運行異常:是指由程序運行環(huán)境問題造成的程序異常中止。 如,程序提出內存分配申請,但內存空間不足;或者是程序運行時要打開文件,但在硬盤中的該文件被刪除或移走等等,這些情況都會造成運行異常。 10.3 異常處理異常處理 C+
34、中使用異常處理基本思想包括:拋出異常、捕獲異常和處理異常。1、拋出異常:是指把程序中出現的異常拋出,等待用戶處理。2、捕獲異常:對出現的異常進行捕獲。3、處理異常:編寫程序對捕獲的異常進行處理,處理的方法由程序決定。 C+中使用throw語句來拋出異常,使用trycatch語句來捕獲和處理異常。10.3.1 10.3.1 異常處理的基本思想異常處理的基本思想1、throw語句 拋出異常的語法格式如下: throw ; 10.3.2 10.3.2 異常處理的實現異常處理的實現 說明:如果某段程序中發(fā)現了自己不能處理的異常情況 ,就可以使用該方式拋出這個異常,將它拋給調用該段程序的函數。其中:表達
35、式值的類型稱為異常類型,它可以是任意的C+的類型(void除外),包括C+的類。具體如下: throw 1; /拋出一個異常,該異常為int類型,值為1throw 1; /拋出一個異常,該異常為char類型,值為字符型數據1。throw “number error”; /拋出一個異常,該異常為char*類型,值為字符串的首地址。 執(zhí)行順序規(guī)定: 當在執(zhí)行完throw語句后,系統(tǒng)將不執(zhí)行throw后面的語句,而是直接跳到異常處理語句部分進行異常的處理。 10.3.2 10.3.2 異常處理的實現異常處理的實現語法格式:try . /可能拋出異常的語句序列 catch( ) . /異常處理代碼 c
36、atch( ) . /異常處理代碼 catch(異常類型名n ) . /異常處理代碼 2、trycatch語句1、若try內的代碼中用throw語句拋出一個異常,則在內部“throw表達式;”代碼執(zhí)行后,立即跳轉到try后的catch塊列表中,按照catch塊出現的先后順序,查找和拋出的異常對象的類型相同的catch塊。若找到,將拋出的異常對象的值賦值給對應catch塊的,并進入該catch塊執(zhí)行(類似一個函數調用過程)。2、執(zhí)行完該catch塊代碼后,系統(tǒng)跳過和其并列的其它的catch塊到trycatch后面的語句進行執(zhí)行。3、所有同級別的catch語句只能有一條被執(zhí)行,不存在兩條被同時執(zhí)行
37、的情況;4、如果在catch語句塊代碼中,其部分的形式表示為三個點(三個點()。即寫成:catch (),系統(tǒng)將把三個點處理成“通配符”,表示捕獲所有類型的異常,并且,此形式只能位于同級別的catch語句中的最后位置。 定義說明定義說明舉例舉例 【例例10-8】試分析下面程序的輸出結果 。#includevoid main() try coutThis is a Test!endl; throw 1; /A行coutIt can not show!endl; /B行 catch(char) cout“*”endl; /C行 /D行 catch(int a) cout“+”endl; /E行 c
38、out”a=”aendl; /F行 catch() cout”catch all type!”; /G行 cout”Test is end!”endl; / /H行運行結果及分析運行結果及分析運行結果:運行結果:This is a Test!+a=1Test is end! 程序分析:程序分析:1、本程序主要是展示trycatch語句的使用;程序的結構是由try和兩個catch語句構成,其中:兩個catch語句是并列的。2、程序的執(zhí)行是從按從上往下的順序依次進行的,當執(zhí)行到程序中的A行時,throw語句拋出了一個異常,這個異常的數據類型是int,值為1。程序轉而去執(zhí)行catch語句,而程序中的
39、B行將不會執(zhí)行。 運行結果及分析運行結果及分析3、兩個catch語句哪個能執(zhí)行呢?系統(tǒng)處理方法為:按照從上往下的順序去看哪catch語句中的數據類型和throw拋出的數據類型相同,即首先判斷程序中的C行中的catch語句中的數據類型是不是int,結果不是。程序將找到第二個catch語句,即程序中的E行,結果類型相同,并且有一個變量a。系統(tǒng)將對a進行賦值,即a=1;程序將繼續(xù)執(zhí)行F行,并輸出a的值。結束了整個trycatch語句的執(zhí)行。4、程序中的G行,為catch語句中的“異常類型名”表示為三個點的形式,即表示捕獲所有的異常,注意是從上往下查找catch語句時,找不到匹配的數據類型,系統(tǒng)將執(zhí)行
40、此catch中的語句塊,如果找到,則不會執(zhí)行此條語句。5、在執(zhí)行完trycatch語句后,系統(tǒng)將按照順序執(zhí)行后面的語句,即執(zhí)行程序中的H行,執(zhí)行完后整個程序執(zhí)行結束。 trycatch語句是可以嵌套的,當某語句的執(zhí)行中拋出異常時,首先在包含它的最內層的try語句塊對應的catch塊列表中查找與之匹配的處理塊,如果內層的catch塊列表類型都不能匹配,即不能捕獲到相應異常,則逐步向外層進行查找。具體如下圖所示: 3、trycatch語句的嵌套 舉例舉例 【例例10-9】試分析下面程序的輸出結果 。#includevoid main()try /A行try /B行throw a; /C行coutf
41、irst!endl; /D行catch(char) /E行throw; /F行coutsecond!endl; /G行catch (.) /H行cout拋出異常!endl; /I行運行結果及分析運行結果及分析運行結果:運行結果:拋出異常! 程序分析:程序分析:1、程序中是trycatch語句的嵌套使用,從A行處開始有一個trycatch語句,第二個trycatch語句從B行處開始,位于第一個trycatch語句的內部。2、程序執(zhí)行是按順序,從上往下依次執(zhí)行,當執(zhí)行到C行時,系統(tǒng)拋出異常,異常類型為字符型,首先由同一級的catch語句進行捕獲,即由程序中的E行經檢查數據類型后,匹配成功程序轉而執(zhí)
42、行該catch語句塊。因此,D行程序不會執(zhí)行。3、當執(zhí)行到F行時,系統(tǒng)又拋出一個異常,而在同級別中沒有相應的catch語句進行捕獲,因此,系統(tǒng)轉而到外層的catch語句中去查找,因此,找到了H行。4、H行的catch語句用的是三個點,系統(tǒng)把它處理成“通配符”,表示捕獲所有類型的異常,因此,系統(tǒng)執(zhí)行I行。執(zhí)行完成后,系統(tǒng)即結束。 舉例舉例 【例例10-10】試編寫程序,處理一個求兩個數據相除的函數,在進行調用時除數為0時的異常 。分析:分析:當函數調用進行求兩個數據的除數時,如果分母為0,則應用throw拋出此異常,在主函數就應該用trycatch語句來捕獲,并在catch語句中進行相應的處理。
43、 #include double fun(double x, double y) /函數的定義 if (y=0) throw y; /當除數為0時,拋出異常 return x/y; /否則,返回兩個數的商 void main() double res; try /定義異常開始 res=fun(2,3); /函數調用 coutThe result of x/y is : resendl; res=fun(4,0); /此次調用會產生異常,函數內部將拋出異常 catch(double) /捕獲并處理異常 cerrerror of dividing zero.n; exit(1); /異常退出程序 舉例舉例 【例例10-11】試定義兩個異常類來處理給定數據范圍條件下的除法運算。要求:異常類的基類用于處理零除數;異常類的派生類則用于處理數據過大或者數據過小時的異常。先通過檢查數據進行處理:當數據超過最大值或者低于最
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南財經職業(yè)學院《漢語詞匯語法教學(詞匯)》2023-2024學年第一學期期末試卷
- 濰坊科技學院《舞蹈基礎與編排》2023-2024學年第一學期期末試卷
- 北京工商大學嘉華學院《醫(yī)學免疫學Ⅲ》2023-2024學年第一學期期末試卷
- 2025年制造業(yè)數據治理策略與能源管理研究報告
- 2025年制造業(yè)綠色供應鏈與綠色供應鏈管理技術創(chuàng)新與綠色產業(yè)生態(tài)發(fā)展策略研究報告001
- 2025年制造業(yè)供應鏈數字化協同管理在綠色供應鏈中的應用研究報告
- 物聯網平臺賦能的農產品供應鏈安全體系構建-洞察及研究
- 室外展板活動方案
- 小學開學德育周活動方案
- 小吃新品活動方案
- 電工廠搬遷方案(3篇)
- 培訓班助教教師管理制度
- 鋼板配送設計方案(3篇)
- 2025年安徽能源集團招聘筆試參考題庫含答案解析
- 河道維修養(yǎng)護管理制度
- 2025年 事業(yè)單位公基真題考試卷庫(附答案)
- 派出所消防管理制度
- 北京市朝陽區(qū)招聘社區(qū)工作者筆試真題2024
- 2025年重慶市中考數學試卷真題(含標準答案)
- 中醫(yī)基礎學課件護理情志
- 2025年中小學教師師德知識競賽試題庫及答案
評論
0/150
提交評論