c++课件学习教案_第1页
c++课件学习教案_第2页
c++课件学习教案_第3页
c++课件学习教案_第4页
c++课件学习教案_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1c+课件课件第一页,编辑于星期五:二十二点 六分。程序举例程序举例类类模板模板函数模板函数模板1异常处理异常处理234第第9 9章章 模板和异常处理模板和异常处理2022-4-24第1页/共63页第二页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理 模板模板常用于表达逻辑结构相同,但具体数据元素常用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为,是实现代码重用类型不同的数据对象的通用行为,是实现代码重用的一种工具,可以实现函数或类要处理的数据类型的一种工具,可以实现函数或类要处理的数据类型参数化,表现为参数的多态性,即将

2、类型定义为参参数化,表现为参数的多态性,即将类型定义为参数,从而实现真正的代码可重用性。数,从而实现真正的代码可重用性。 模板有两种,一种是模板有两种,一种是函数模板函数模板,另一种是,另一种是类模板类模板。 不管是哪种模板都不是实实在在的类或函数,而仅不管是哪种模板都不是实实在在的类或函数,而仅仅是对类或函数的描述。仅是对类或函数的描述。 第2页/共63页第三页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理 异常处理异常处理一般用在大型软件中,由于函数之间有一般用在大型软件中,由于函数之间有着明确的分工和复杂的调用关系,发现错误的函数往着明确

3、的分工和复杂的调用关系,发现错误的函数往往不具备处理错误的能力。此时异常处理机制可将异往不具备处理错误的能力。此时异常处理机制可将异常的检测与处理分离。常的检测与处理分离。 当在一个函数体中检测到异常条件存在,但当在一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数将引发却无法确定相应的处理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这一个异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。个异常并处理这个错误。第3页/共63页第四页,编辑于星期五:二十二点 六分。9.1 9.1 函数模板函数模板 函数模板的定义函数模板的定义 函数模板函数模板是一个通用函

4、数,其函数类是一个通用函数,其函数类型和形参类型不具体指定,而是用一个虚型和形参类型不具体指定,而是用一个虚拟的类型来代表。拟的类型来代表。 函数模板并不是真正的函数,只是一函数模板并不是真正的函数,只是一种产生多种函数的模式或者框架。种产生多种函数的模式或者框架。2022-4-24第第9 9章章 模板和异常处理模板和异常处理第4页/共63页第五页,编辑于星期五:二十二点 六分。 函数模板的定义函数模板的定义函数模板函数模板定义的一般格式如下:定义的一般格式如下:templatetemplate T函数类型函数类型 函数名函数名( (形参列表形参列表) ) 函数体函数体 这里,这里,templ

5、atetemplate是关键字,表示声明一个模板;是关键字,表示声明一个模板;尖括号中不能为空,其中尖括号中不能为空,其中typenametypename(或使用(或使用classclass)是类型参数说明关键字;)是类型参数说明关键字;T T是类型参数。是类型参数。2022-4-24第第9 9章章 模板和异常处理模板和异常处理第5页/共63页第六页,编辑于星期五:二十二点 六分。函数模板的定义函数模板的定义2022-4-24第第9 9章章 模板和异常处理模板和异常处理如:如:template template T GetMax (T a, T b) return (ab?a:b); T Ge

6、tMax (T a, T b) return (ab?a:b); 函数模板定义中类型参数可以是一个,也可以是多个,如函数模板定义中类型参数可以是一个,也可以是多个,如果多于一个,则每个形参前都要加关键字果多于一个,则每个形参前都要加关键字typenametypename(或(或classclass),),且各类型参数间用逗号隔开。如:且各类型参数间用逗号隔开。如: template template T GetMin (T a, U b) return (ab? a: b); T GetMin (T a, U b) return (ab? a: b); 此时函数此时函数 GetMin GetM

7、in可以接受两个不同类型的参数,通过可以接受两个不同类型的参数,通过T T和和U U来来区分,结果将返回一个与第一个参数同类型的数据。区分,结果将返回一个与第一个参数同类型的数据。第6页/共63页第七页,编辑于星期五:二十二点 六分。 函数模板的定义函数模板的定义 函数模板可以生成通用的函数,这些函函数模板可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数任意类型的值,而不需要对所有可能的数据类型进行函数重载时的匹配检查。据类型进行函数重载时的匹配检查。2022-4-24第第9 9章章 模板和异常处理模板和异常

8、处理第7页/共63页第八页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板函数模板的使用函数模板的使用 函数模板定义后,可以直接用实参代函数模板定义后,可以直接用实参代替函数模板定义中的形参,来实现对该替函数模板定义中的形参,来实现对该函数的调用。具体形式为:函数的调用。具体形式为: 函数名函数名( (实参表实参表); ); 编译器将根据用户给出的实参类型,生成编译器将根据用户给出的实参类型,生成相应的重载函数。生成的重载函数称为相应的重载函数。生成的重载函数称为模板模板函数函数,是一个实实在在的函数。,是一个实实

9、在在的函数。第8页/共63页第九页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板函数模板的使用函数模板的使用如:如: template T GetMax (T a, T b) return (ab?a:b); int main ( ) cout GetMax ( 7 , 2 )= GetMax ( 7 , 2 ) endl ; /输出输出7 cout GetMax ( p , Q )= GetMax ( P , Q ) endl ; /输出字符输出字符Q cout GetMax ( 3.2 , 9.01 )= G

10、etMax ( 3.2 , 9.01 ) endl ; /输出输出9.01 return 0; 第9页/共63页第十页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板函数模板的使用函数模板的使用再如:再如:template T GetMin (T a, U b) return (ab? a: b); int main() int i,j=555; char k=5; i = GetMin (j, k); /A coutin; /输出字符输出字符5的的ASCII码值码值53 return 0;A行也可用如下语句:行也

11、可用如下语句:i = GetMin (j,k);模板参数也可以设置缺省值,与为函数参数设置缺省值类似。如:模板参数也可以设置缺省值,与为函数参数设置缺省值类似。如:template /有一个默认值有一个默认值第10页/共63页第十一页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板函数模板的使用函数模板的使用【例【例9-19-1】定义一个冒泡排序法的函数模板。定义一个冒泡排序法的函数模板。程序设计程序设计 冒泡排序法的具体步骤为:依次比较相邻的两个数,即首先比较第冒泡排序法的具体步骤为:依次比较相邻的两个数,即首先

12、比较第一个和第二个数,将小数放前,大数放后;然后比较第二个数和第三一个和第二个数,将小数放前,大数放后;然后比较第二个数和第三个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。此时第一趟结束,最大的数放到了最后。第二小数放前,大数放后。此时第一趟结束,最大的数放到了最后。第二趟仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数趟仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数第二个数,第二趟结束,在倒数第二的位置上得到一个第二大数。如第二个数,第二趟结束,在倒数第二的位置上得到一个第二大

13、数。如此下去,重复以上过程,直至最终完成排序。此下去,重复以上过程,直至最终完成排序。 考虑到数据序列的存储,函数模板中应有两个参数,一个是数据序考虑到数据序列的存储,函数模板中应有两个参数,一个是数据序列的首地址,另一个是数据序列的长度。列的首地址,另一个是数据序列的长度。第11页/共63页第十二页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板函数模板的使用函数模板的使用源程序代码源程序代码#include #include #include #include using namespace std;using

14、 namespace std;template template /定义模板函数定义模板函数void SortBubble ( ElementType void SortBubble ( ElementType * *a , int size )a , int size ) int i, work ; int i, work ; ElementType temp ; ElementType temp ; for (int pass = 1; pass size; pass + ) for (int pass = 1; pass size; pass + ) work = 1; work = 1

15、; for ( i = 0; i size-pass; i + ) for ( i = 0; i ai+1 ) if ( ai ai+1 ) temp = ai ; ai = ai+1 ; ai+1 = temp ; work = 0 ; temp = ai ; ai = ai+1 ; ai+1 = temp ; work = 0 ; if ( work ) break ; if ( work ) break ; 第12页/共63页第十三页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板函数模板的使用函数模板的使用

16、int main()int main() int b5=7,5,2,8,1; int b5=7,5,2,8,1; char c=“xkdwzeopb”; char c=“xkdwzeopb”; SortBubble (b,5); SortBubble (b,5); /调用模板函数调用模板函数 for(int i=0;i5;i+) for(int i=0;i5;i+) coutbit; coutbit; /输出输出1 2 5 7 81 2 5 7 8 coutn; coutn; SortBubble (c,strlen(c); SortBubble (c,strlen(c); coutcn; c

17、outcn; /输出输出bdekopwxzbdekopwxz return 0; return 0; 第13页/共63页第十四页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板重载重载函数模板函数模板 与函数重载类似,函数模板间可以相互重载,函数模板与函与函数重载类似,函数模板间可以相互重载,函数模板与函数间同样可以相互重载。数间同样可以相互重载。【例【例9-29-2】重载函数模板示例。重载函数模板示例。源程序代码源程序代码#include #include #include #include using name

18、space std;using namespace std;template template /A/AT Max(T a, T b ) return ab ? a : b ; T Max(T a, T b ) return ab ? a : b ; template template /B/B第14页/共63页第十五页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板重载重载函数模板函数模板T Max(T a, T b , T c) T t ; t = Max(a, b) ; return Max ( t, c )

19、 ; int Max(int a , char b ) return ab ? a : b ; /Cint main ( ) cout Max( 3, a ) is Max( 3, a ) endl ; /D cout Max(9.3, 0.5) is Max(9.3, 0.5) endl ; /E cout Max(9, 5, 23) is Max(9, 5, 23) endl ; /F return 0; 程序运行结果程序运行结果Max 3Max is 97 is 97Max 9.3Max is 9.30.5 is 9.3Max 9Max is 2323 is 23第15页/共63页第十六

20、页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板重载重载函数模板函数模板 例例9-29-2在调用时,首先寻找和使用最符合函数在调用时,首先寻找和使用最符合函数名和参数类型的函数,若找到则调用它,如名和参数类型的函数,若找到则调用它,如D D行调用行调用C C行定义的函数;行定义的函数; 否则,寻找一个函数模否则,寻找一个函数模板,将其实例化产生一个匹配的模板函数,若找板,将其实例化产生一个匹配的模板函数,若找到则调用它,如到则调用它,如E E行调用行调用A A行定义的函数模板,行定义的函数模板,F F行行调用调用

21、B B行定义的函数模板。行定义的函数模板。第16页/共63页第十七页,编辑于星期五:二十二点 六分。 第第9 9章章 模板和异常处理模板和异常处理9.1 9.1 函数模板函数模板重载重载函数模板函数模板 一般地在一般地在C+C+语言中函数模板与同名的非模板函数语言中函数模板与同名的非模板函数重载时,遵循下列调用原则:重载时,遵循下列调用原则:(1 1)寻找一个与参数完全匹配的函数,若找到就调用它。若)寻找一个与参数完全匹配的函数,若找到就调用它。若参数完全匹配的函数多于一个,则这个调用将是一个错误的调参数完全匹配的函数多于一个,则这个调用将是一个错误的调用。用。(2 2)寻找一个函数模板,若找

22、到就将其实例化,生成一个匹)寻找一个函数模板,若找到就将其实例化,生成一个匹配的模板函数并调用它。配的模板函数并调用它。(3 3)若上面两条都失败,则使用函数重载的方法,通过类型)若上面两条都失败,则使用函数重载的方法,通过类型转换产生参数匹配,若找到就调用它。转换产生参数匹配,若找到就调用它。(4 4)若上面)若上面3 3条都失败,即没有找到都匹配的函数,则条都失败,即没有找到都匹配的函数,则这个调用是一个错误的调用,系统将报错。这个调用是一个错误的调用,系统将报错。第17页/共63页第十八页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.

23、2 9.2 类模板类模板类模板的定义类模板的定义 类模板类模板用于实现类所需数据的类型参数化。类模板在表示如用于实现类所需数据的类型参数化。类模板在表示如数组、表、图等数据结构时显得特别重要,这些数据结构的表数组、表、图等数据结构时显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响。示和算法不受所包含的元素类型的影响。类模板定义的一般格式为:类模板定义的一般格式为: template template T class class 类名类名 /类体类体 ; ;这里关键字这里关键字templatetemplate、typenametypename(或用(或用classclass)及)

24、及T T与函数模板与函数模板定义中的类似。定义中的类似。第18页/共63页第十九页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.2 9.2 类模板类模板类模板的定义类模板的定义 类模板定义中,凡要采用类型参数类模板定义中,凡要采用类型参数T T的数据成员、成员函数的的数据成员、成员函数的参数或函数类型前都要加上类型标识符参数或函数类型前都要加上类型标识符T T。如果类模板中的成员。如果类模板中的成员函数要在类外定义,则它必须是函数模板。其定义的一般函数要在类外定义,则它必须是函数模板。其定义的一般格式为:格式为: templatetempl

25、ate T 函数类型函数类型 类名类名 : : 成员函数名成员函数名( (形参列表形参列表) ) 函数体函数体 类模板使类中的数据成员和成员函数的参数或返回值类模板使类中的数据成员和成员函数的参数或返回值可以取任意的数据类型。它不是一个具体的类,而是代可以取任意的数据类型。它不是一个具体的类,而是代表着一簇类,是这一簇类的统一模式。表着一簇类,是这一簇类的统一模式。第19页/共63页第二十页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.2 9.2 类模板类模板类模板的定义类模板的定义【例【例9-39-3】定义一个包含两个私有数据成员、一个构

26、造函定义一个包含两个私有数据成员、一个构造函数和一个输出成员函数的类模板。数和一个输出成员函数的类模板。 源程序代码源程序代码 template template /A/A class AA class AA private: private: T1 i; T1 i; /B/B T2 j; T2 j; public: public: AA(T1 a,T2 b); AA(T1 a,T2 b); void print( );void print( ); ; ;第20页/共63页第二十一页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.2 9.2

27、类模板类模板类模板的定义类模板的定义 template template /C/C AA: AA(T1 a, T2 b): i(a), j(b) AA: AA(T1 a, T2 b): i(a), j(b) /D/D template template void AA: print( ) void AA: print( )couti=icouti=i , j=jendl; , j=jendl; 例例9-39-3中的中的A A行为定义类模板,注意行末不能加分号,因为它行为定义类模板,注意行末不能加分号,因为它要和下面的类定义构成一个整体;要和下面的类定义构成一个整体;B B行定义了类的一个私有行

28、定义了类的一个私有数据数据i i;C C行和行和D D行合在一起构成了在类外定义行合在一起构成了在类外定义AAAA类的构类的构造函数造函数AAAA;同样;同样printprint函数前的函数模板定义也不能少。函数前的函数模板定义也不能少。第21页/共63页第二十二页,编辑于星期五:二十二点 六分。 使用类模板就是要将它实例化为具体的类,将类模板的模板参数使用类模板就是要将它实例化为具体的类,将类模板的模板参数实例化后生成的具体类,称为模板类。模板类是一个实实在在的类。实例化后生成的具体类,称为模板类。模板类是一个实实在在的类。利用类模板可以产生多种不同的模板类。如利用例利用类模板可以产生多种不

29、同的模板类。如利用例9-39-3中的类模板中的类模板AAAA,可以产生多个模板类,例举其中一部分:可以产生多个模板类,例举其中一部分: AA AA; /第一个参数是第一个参数是int,int,第二个参数也是第二个参数也是intint AA AA; /第一个参数是第一个参数是int, int, 第二个参数是第二个参数是charchar AAAA, char AAAA, char /第一个参数是具有第一个参数是具有AAAA类的类型,第二个参数是类的类型,第二个参数是charchar AAint AA,int /第一个参数是指向第一个参数是指向intint的指针类型,第二个参数是的指针类型,第二个参

30、数是intint2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.2 9.2 类模板类模板类模板的使用类模板的使用第22页/共63页第二十三页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.2 9.2 类模板类模板类模板的使用类模板的使用 有了确定类型的模板类后,就能利用它来创建有了确定类型的模板类后,就能利用它来创建类的实例,即产生类的对象。其定义的一般格式类的实例,即产生类的对象。其定义的一般格式如下:如下:类名类名 对象名对象名1( 1(实参列实参列1) 1),对象,对象名名2( 2(实参列实参列2) 2),对象名,对象

31、名n(n(实参列实参列n)n); 其中,类名其中,类名 为实例化的模板为实例化的模板类。系统会先创建一个具体的模板类,再生成类。系统会先创建一个具体的模板类,再生成该模板类(具体类)的对象。该模板类(具体类)的对象。第23页/共63页第二十四页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.2 9.2 类模板类模板类模板的使用类模板的使用【例【例9-49-4】定义定义9-39-3例中的模板类并生成对象,在例中的模板类并生成对象,在主函数中完成对相关成员函数的调用测试。主函数中完成对相关成员函数的调用测试。 程序设计程序设计 在主函数中定义模板

32、类并生成对象,在主函数中定义模板类并生成对象,利用对象调用成员函数来完成对定义类的测试。利用对象调用成员函数来完成对定义类的测试。第24页/共63页第二十五页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.2 9.2 类模板类模板类模板的使用类模板的使用 源程序代码源程序代码int main()int main() AA a1(3,5); AA a1(3,5);/实例化类模板并生成实例化类模板并生成a1a1对象对象 a1.print(); a1.print();/调用调用a1a1对象的成员函数对象的成员函数printprint AA a2(4

33、,a); AA a2(4,a); a2.print(); a2.print(); AA a3(2.9,10); AA a3(2.9,10); a3.print(); a3.print(); return 0; return 0; 程序运行结果程序运行结果(将程序(将程序补充完整后运行)补充完整后运行)i i3 3,j j5 5i i4 4,j ja ai i2.92.9,j j1010第25页/共63页第二十六页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理 异常异常是指是指C+C+语言运行时产生的错误,它是由大

34、量语言运行时产生的错误,它是由大量的例外情况产生的,例如内存用尽,不能打开文件,的例外情况产生的,例如内存用尽,不能打开文件,使用不合适的值初始化对象等等。使用不合适的值初始化对象等等。 异常处理的任务异常处理的任务是在程序设计时,事先分析程序运是在程序设计时,事先分析程序运行时可能出现的各种意外情况,分别制订出相应的行时可能出现的各种意外情况,分别制订出相应的处理方法。处理方法。 异常处理的基本思想异常处理的基本思想是将异常的检测与处理分离。当在是将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但却无法确定相应的一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数

35、将引发一个异常,由函数的直接或间处理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。接调用者捕获这个异常并处理这个错误。第26页/共63页第二十七页,编辑于星期五:二十二点 六分。 异常处理的机制异常处理的机制2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理 异常处理的机制为抛出异常、捕获异常和处理异常。异常处理的机制为抛出异常、捕获异常和处理异常。C+C+语语言中使用言中使用throwthrow抛出异常,使用抛出异常,使用trycatchtrycatch捕获和处理异常。捕获和处理异常。其处理过程如下:其处理过程如

36、下:(1 1)设置异常块并抛出。将可能出现错误或异常的代码)设置异常块并抛出。将可能出现错误或异常的代码块设置成被监视代码块,在发生异常时用块设置成被监视代码块,在发生异常时用throwthrow将该块抛出,将该块抛出,称为抛出一个异常。称为抛出一个异常。(2 2)将被监视代码块放到)将被监视代码块放到trytry结构中进行监视。结构中进行监视。(3 3)若被监视代码块抛出异常,进入)若被监视代码块抛出异常,进入catchcatch结构进行处理。结构进行处理。第27页/共63页第二十八页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处

37、理模板和异常处理9.3 9.3 异常处理异常处理1 1throwthrow语句语句 当某段程序发现了自己不能处理的异常,就可以使用当某段程序发现了自己不能处理的异常,就可以使用throwthrow语句将这个异常抛掷给调用者。语句将这个异常抛掷给调用者。throwthrow语句的一般格式为:语句的一般格式为: throw throw ; throw throw语句的使用与语句的使用与returnreturn语句相似,如果程序中有多处要语句相似,如果程序中有多处要抛掷异常,应该用不同的表达式类型来互相区别,称为抛掷异常,应该用不同的表达式类型来互相区别,称为异异常类型常类型。表达式的值不能用来区别

38、不同的异常。表达式的值不能用来区别不同的异常。第28页/共63页第二十九页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理如:如: throw 1; throw 1; /A/A throw 1; throw 1; /B/B throw “number error”; throw “number error”; /C/C A A行抛出一个异常,该异常为行抛出一个异常,该异常为intint类型,值为类型,值为1 1;B B行抛出一行抛出一个异常,该异常为个异常,该异常为charchar类型,

39、值为字符型数据类型,值为字符型数据1 1;C C行抛出行抛出一个异常,该异常为一个异常,该异常为charchar* *类型,值为字符串的首地址。在执行完类型,值为字符串的首地址。在执行完throwthrow语句后,系统将不执行语句后,系统将不执行throwthrow后面的语句,而是直接跳后面的语句,而是直接跳到异常处理语句部分进行异常处理。到异常处理语句部分进行异常处理。第29页/共63页第三十页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理2trycatch块语句块语句 如果预料某段

40、程序代码(或对某个函数的调用)有可能发生异如果预料某段程序代码(或对某个函数的调用)有可能发生异常,就将它放在常,就将它放在try语句之后。如果这段代码(或被调函数)语句之后。如果这段代码(或被调函数)运行时真的遇到异常情况,其中的运行时真的遇到异常情况,其中的throw表达式就会抛掷这个表达式就会抛掷这个异常。异常。try块语句的一般格式为:块语句的一般格式为: try /可能抛出异常的语句序列可能抛出异常的语句序列 catch ( 异常类型名异常类型名 异常对象名异常对象名) /异常处理代码异常处理代码 第30页/共63页第三十一页,编辑于星期五:二十二点 六分。 2022-4-24异常处

41、理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理 若若trytry内的代码中有用内的代码中有用throwthrow语句抛出的一个异常,则在语句抛出的一个异常,则在throwthrow语句执行后,立即跳转到语句执行后,立即跳转到trytry后的后的catchcatch块列表中,查找异常块列表中,查找异常类型名和抛出的异常对象的类型相同的类型名和抛出的异常对象的类型相同的catchcatch块。块。 若找到,将抛出的异常对象值赋给对应若找到,将抛出的异常对象值赋给对应catchcatch块的异常块的异常对象,并进入对象,并进入catchcatch块

42、执行(类似函数调用过程)。块执行(类似函数调用过程)。 执行完执行完catchcatch块代码后,系统跳到块代码后,系统跳到trycatchtrycatch后面的语句后面的语句进行执行。进行执行。第31页/共63页第三十二页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理关于异常处理使用有如下几点说明:关于异常处理使用有如下几点说明:(1 1)trytry块和块和catchcatch块作为一个整体出现,块作为一个整体出现,catchcatch块是块是trycatchtrycatch块块的

43、一部分,不可以单独使用,两者之间不能插入其他的一部分,不可以单独使用,两者之间不能插入其他语句。语句。(2 2)trytry块和块和catchcatch块中必须用花括号括起来,即使花括号内只有块中必须用花括号括起来,即使花括号内只有一个语句,也不可以省略花括号。一个语句,也不可以省略花括号。第32页/共63页第三十三页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理(3 3)trycatchtrycatch块语句中只能有一个块语句中只能有一个trytry块,但后可跟多个块,但后可跟多个c

44、atchcatch块,以便与不同的异常信息相匹配。此时按照块,以便与不同的异常信息相匹配。此时按照catchcatch块出块出现的先后顺序,查找异常类型名和抛出的异常对象的现的先后顺序,查找异常类型名和抛出的异常对象的类型相同的类型相同的catchcatch块。所有同级别的块。所有同级别的catchcatch块语句只能有一条块语句只能有一条被执行,不存在两条被同时执行的情况。被执行,不存在两条被同时执行的情况。(4 4)如果在)如果在catchcatch语句块代码中,异常类型名部分的形式语句块代码中,异常类型名部分的形式为省略号(为省略号(),即写成),即写成catch catch (),系统

45、将该省略号处理成),系统将该省略号处理成“通配符通配符”,表示捕获所有类型的异常,并且,此形式只能位于,表示捕获所有类型的异常,并且,此形式只能位于同级别的同级别的catchcatch语句的最后位置。语句的最后位置。第33页/共63页第三十四页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理(5 5)trycatchtrycatch语句块是可以嵌套的。语句块中的语句块是可以嵌套的。语句块中的trytry块和块和catchcatch块也可以不在同一个函数中,当用块也可以不在同一个函数中,当

46、用throwthrow抛出异常信息时,抛出异常信息时,首先在本函数中寻找与之匹配的首先在本函数中寻找与之匹配的catchcatch块,如果本函数中找不到,块,如果本函数中找不到,就转到上一层去处理,再找不到,则转到更上一层去处理,直至找就转到上一层去处理,再找不到,则转到更上一层去处理,直至找到后处理。如果一直找不到,系统会调用一个系统函数到后处理。如果一直找不到,系统会调用一个系统函数terminateterminate,使程序终止运行。使程序终止运行。(6 6)throwthrow语句也可以这样用:语句也可以这样用: throw;throw;此时表示不处理这个异常,交给上级处理,即将当前正

47、此时表示不处理这个异常,交给上级处理,即将当前正在处理的异常信息再次抛出,给其上一层的在处理的异常信息再次抛出,给其上一层的catchcatch块处理。块处理。 第34页/共63页第三十五页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理【例【例9-59-5】试分析下面程序的输出结果。】试分析下面程序的输出结果。#include#includeusing namespace std;using namespace std;int main() int main() try try cou

48、t“This is a Test!”endl; cout“This is a Test!”endl; throw 1; throw 1; /A/A cout“It can not show!”endl; cout“It can not show!”endl; /B/B catch(char) catch(char) /C/C cout“ cout“* * * * * * *”endl; ”endl; /D/D 第35页/共63页第三十六页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理

49、catch(int a) catch(int a) /E/Ecout+endl; cout+endl; /F/Fcout“a=”aendl;cout“a=”aendl; catch(.) catch(.) /G/Gcout“catch all type!”;cout“catch all type!”; coutTest is end!endl; coutTest is end!endl; /H/H return 0; return 0; 程序运行结果程序运行结果This is a Test!This is a Test!+a=1a=1Test is end!Test is end!第36页/共

50、63页第三十七页,编辑于星期五:二十二点 六分。 2022-4-24异常处理的异常处理的实现实现第第9 9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理 例例9-59-5程序是由一个程序是由一个trytry块和块和3 3个个catchcatch块语句构成,且块语句构成,且3 3个个catchcatch块语句是并列的。程序的执行按从上往下的顺序依次进行,当块语句是并列的。程序的执行按从上往下的顺序依次进行,当执行到执行到A A行时,行时,throwthrow语句抛出了一个异常,这个异常的数据类语句抛出了一个异常,这个异常的数据类型是型是intint,值为,值为1 1。 程序转

51、而去执行程序转而去执行catchcatch语句,而程序中的语句,而程序中的B B行将不会执行。行将不会执行。 接着按照从上往下的顺序找接着按照从上往下的顺序找catchcatch块语句中的数据类型和块语句中的数据类型和throwthrow抛出的数据类型相同的,例抛出的数据类型相同的,例9-59-5首先判断首先判断C C行中的行中的catchcatch块语块语句中的数据类型是不是句中的数据类型是不是intint,结果不是。然后找到第二个,结果不是。然后找到第二个catchcatch块块语句,即程序中的语句,即程序中的E E行,结果类型相同,并且有一个变量行,结果类型相同,并且有一个变量a a。第

52、37页/共63页第三十八页,编辑于星期五:二十二点 六分。 2022-4-24 系统将对系统将对a a进行赋值,即进行赋值,即a=1a=1;程序继续执行;程序继续执行F F行,并输行,并输出出a a的值。结束整个的值。结束整个trycatchtrycatch块语句的执行。块语句的执行。 G G行行catchcatch语句中的语句中的“异常类型名异常类型名”表示为省略号的形式,即表示为省略号的形式,即表示捕获所有的异常,注意是从上往下查找表示捕获所有的异常,注意是从上往下查找catchcatch语句时,找语句时,找不到匹配的数据类型,系统将执行此不到匹配的数据类型,系统将执行此catchcatc

53、h块中的语句,如块中的语句,如果找到,则不会执行此条语句。果找到,则不会执行此条语句。 在执行完在执行完trycatchtrycatch块语句后,系统将按照顺序执行后块语句后,系统将按照顺序执行后面的语句,即执行程序中的面的语句,即执行程序中的H H行,执行后整个程序结束。行,执行后整个程序结束。 值得注意的是由于值得注意的是由于c+c+语言的构造函数没有返回值,故适合用异语言的构造函数没有返回值,故适合用异常机制解决创建对象失败问题。当创建对象失败时,可以在构造函常机制解决创建对象失败问题。当创建对象失败时,可以在构造函数中抛出一个异常。数中抛出一个异常。异常处理的异常处理的实现实现第第9

54、9章章 模板和异常处理模板和异常处理9.3 9.3 异常处理异常处理第38页/共63页第三十九页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.4 9.4 程序举例程序举例【例【例9-69-6】编写程序,定义一个类模板,实现先读取第一个元编写程序,定义一个类模板,实现先读取第一个元素值,再将指针指向数组起点。创建一个含有素值,再将指针指向数组起点。创建一个含有2020个整数的数组,个整数的数组,然后设置数组的元素值为然后设置数组的元素值为00,2 2,4 4,3838, 最后输出数组最后输出数组元素。元素。源程序代码源程序代码#include

55、 #include using namespace std;using namespace std;template template /定义类模板定义类模板第39页/共63页第四十页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.4 9.4 程序举例程序举例class array T dataSIZE; array (const array& other); const array& operator = (const array& other);public: array(); T& operator(in

56、t i) return datai; 第40页/共63页第四十一页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.4 9.4 程序举例程序举例 const T& getelem (int i) const return datai; void setelem(int i, const T& value) datai = value; operator T*() return data; ; 第41页/共63页第四十二页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.4 9.4

57、 程序举例程序举例int main(void) array aa; for(int i=0;i20;i+)aa.setelem(i, 2*i); int firstElem = aa.getelem(0); int *begin = aa; for(i=0;i20;i+)coutbeginit; return 0;程序运行结果程序运行结果0 2 4 6 8 10 12 14 16 180 2 4 6 8 10 12 14 16 1820 22 24 26 28 30 32 34 36 3820 22 24 26 28 30 32 34 36 38第42页/共63页第四十三页,编辑于星期五:二十

58、二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.4 9.4 程序举例程序举例【例【例9-79-7】定义类模板实现对不同类型数组的排序。定义类模板实现对不同类型数组的排序。源程序代码源程序代码#include #include #include #include using namespace std;using namespace std;template template class Vectorclass VectorT T * *v; v;int sz;int sz;第43页/共63页第四十四页,编辑于星期五:二十二点 六分。 2022-4-24publi

59、c: Vector(T a,int s)v=new Ts;sz=s;for(int i=0;isz;i+) vi=ai; void print()for(int i=0;isz;i+) coutvit;coutn; int size( ) return sz; T& elem(int i) return vi; friend void sort(Vector &w);template void sort(Vector &w) int n=w.size( ); for(int i=0;in-1;i+) for(int j=i; jn; j+)if(w.vjw.vi) T

60、temp=w.vj; w.vj=w.vi; w.vi=temp; 第第9 9章章 模板和异常处理模板和异常处理9.4 9.4 程序举例程序举例第44页/共63页第四十五页,编辑于星期五:二十二点 六分。 2022-4-24第第9 9章章 模板和异常处理模板和异常处理9.4 9.4 程序举例程序举例int main() int b6=5,8,2,7,4,3; Vectoraa(b,6); cout“原整型数组为:原整型数组为:”; aa.print();sort(aa); cout“排序后的整型数组为:排序后的整型数组为:”;aa.print(); char str=“ueDSHture”; Vectordd(str,strlen(str); cout“n原字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论