《c++课件学习教程.pptx》由会员分享,可在线阅读,更多相关《c++课件学习教程.pptx(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、程序举例程序举例类类模板模板本章内容函数模板函数模板1异常处理异常处理234第第9章章 模板和异常处理模板和异常处理2023/3/23第1页/共63页第一页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理 模板模板常用于表达逻辑结构相同,但具体数据元素类常用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为,是实现代码重用的一型不同的数据对象的通用行为,是实现代码重用的一种工具,可以实现函数或类要处理的数据类型参数化,种工具,可以实现函数或类要处理的数据类型参数化,表现为参数的多态性,即将类型定义为参数,从而实表现为参数的多态性,即将类型
2、定义为参数,从而实现真正的代码可重用性。现真正的代码可重用性。模板有两种,一种是模板有两种,一种是函数模板函数模板,另一种是,另一种是类模板类模板。不管是哪种模板都不是实实在在的类或函数,而仅不管是哪种模板都不是实实在在的类或函数,而仅仅是对类或函数的描述。仅是对类或函数的描述。第2页/共63页第二页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理 异常处理异常处理一般用在大型软件中,由于函数之间一般用在大型软件中,由于函数之间有着明确的分工和复杂的调用关系,发现错误的有着明确的分工和复杂的调用关系,发现错误的函数往往不具备处理错误的能力。此时异常处
3、理函数往往不具备处理错误的能力。此时异常处理机制可将异常的检测与处理分离。机制可将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但却当在一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数将引发一个无法确定相应的处理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这个异常异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。并处理这个错误。第3页/共63页第三页,编辑于星期五:十二点 三十七分。9.1 函数模板函数模板 函数模板的定义函数模板的定义 函数模板函数模板是一个通用函数,其函数类是一个通用函数,其函数类型和形参类型不具体指定,而是用一个型和形
4、参类型不具体指定,而是用一个虚拟的类型来代表。虚拟的类型来代表。函数模板并不是真正的函数,只是函数模板并不是真正的函数,只是一种产生多种函数的模式或者框架。一种产生多种函数的模式或者框架。2023/3/23第第9章章 模板和异常处理模板和异常处理第4页/共63页第四页,编辑于星期五:十二点 三十七分。9.1函数模板 函数模板的定义函数模板的定义函数模板函数模板定义的一般格式如下:定义的一般格式如下:templatetemplate T函数类型函数类型 函数名函数名(形参列表形参列表)函数体函数体 这里,这里,templatetemplate是关键字,表示声明一个模板;是关键字,表示声明一个模板
5、;尖括号中不能为空,其中尖括号中不能为空,其中typenametypename(或使用(或使用classclass)是类型参数说明关键字;是类型参数说明关键字;T T是类型参数。是类型参数。2023/3/23第第9章章 模板和异常处理模板和异常处理第5页/共63页第五页,编辑于星期五:十二点 三十七分。9.1 函数模板函数模板的定义函数模板的定义2023/3/23第第9章章 模板和异常处理模板和异常处理如:如:template template T GetMax(T a,T b)return(ab?a:b);T GetMax(T a,T b)return(ab?a:b);函数模板定义中类型参数
6、可以是一个,也可以是多个,如果函数模板定义中类型参数可以是一个,也可以是多个,如果多于一个,则每个形参前都要加关键字多于一个,则每个形参前都要加关键字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 GetMin可以接受两个不同类型的参数,通过可以接受两个不同类型的参数,通过T T和和U U来区分,结果将返回一个与第一个参数
7、同类型的数据。来区分,结果将返回一个与第一个参数同类型的数据。第6页/共63页第六页,编辑于星期五:十二点 三十七分。9.1 函数模板 函数模板的定义函数模板的定义 函数模板可以生成通用的函数,这些函数模板可以生成通用的函数,这些函数能够接受任意数据类型的参数,可函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载时的匹配检能的数据类型进行函数重载时的匹配检查。查。2023/3/23第第9章章 模板和异常处理模板和异常处理第7页/共63页第七页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理
8、模板和异常处理9.1 函数模板函数模板函数模板的使用函数模板的使用 函数模板定义后,可以直接用实参代替函数模板定义后,可以直接用实参代替函数模板定义中的形参,来实现对该函数函数模板定义中的形参,来实现对该函数的调用。具体形式为:的调用。具体形式为:函数名函数名(实参表实参表););编译器将根据用户给出的实参类型,生编译器将根据用户给出的实参类型,生成相应的重载函数。生成的重载函数称为成相应的重载函数。生成的重载函数称为模板函数模板函数,是一个实实在在的函数。,是一个实实在在的函数。第8页/共63页第八页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理
9、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)=GetMax(3.2,9.01)endl;/输出输出9.01 return 0;第9页/共63页第九页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.1 函数模板函数模板函数模板
10、的使用函数模板的使用再如:再如: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行也可用如下语句:行也可用如下语句:i=GetMin(j,k);模板参数也可以设置缺模板参数也可以设置缺省值,与为函数参数设省值,与为函数参数设置缺省值类似。如:置缺省值类似。如:template /有一个默认值有一个默认值第10页/共63页第十页,编辑于星期五:十二点 三十七分。2023/3/23第第9
11、章章 模板和异常处理模板和异常处理9.1 函数模板函数模板函数模板的使用函数模板的使用【例【例9-19-1】定义一个冒泡排序法的函数模板。定义一个冒泡排序法的函数模板。程序设计程序设计 冒泡排序法的具体步骤为:依次比较相邻的两个数,即首先比较第冒泡排序法的具体步骤为:依次比较相邻的两个数,即首先比较第一个和第二个数,将小数放前,大数放后;然后比较第二个数和第三一个和第二个数,将小数放前,大数放后;然后比较第二个数和第三个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。此时第一趟结束,最大的数放到了最后。第
12、二小数放前,大数放后。此时第一趟结束,最大的数放到了最后。第二趟仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数趟仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数第二个数,第二趟结束,在倒数第二的位置上得到一个第二大数。如第二个数,第二趟结束,在倒数第二的位置上得到一个第二大数。如此下去,重复以上过程,直至最终完成排序。此下去,重复以上过程,直至最终完成排序。考虑到数据序列的存储,函数模板中应有两个参数,一个是数据考虑到数据序列的存储,函数模板中应有两个参数,一个是数据序列的首地址,另一个是数据序列的长度。序列的首地址,另一个是数据序列的长度。第11页/共63页第十一页,编
13、辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.1 函数模板函数模板函数模板的使用函数模板的使用源程序代码源程序代码#include#include#include#include using namespace std;using namespace std;template template /定义模板函数定义模板函数void SortBubble(ElementType *a,int size)void SortBubble(ElementType *a,int size)int i,work;int i,work;ElementType te
14、mp;ElementType temp;for(int pass=1;pass size;pass+)for(int pass=1;pass size;pass+)work=1;work=1;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页第十二页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.
15、1 函数模板函数模板函数模板的使用函数模板的使用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);cout
16、cn;coutcn;/输出输出bdekopwxzbdekopwxz return 0;return 0;第13页/共63页第十三页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.1 函数模板函数模板重载重载函数模板函数模板 与函数重载类似,函数模板间可以相互重载,函数模板与函与函数重载类似,函数模板间可以相互重载,函数模板与函数间同样可以相互重载。数间同样可以相互重载。【例【例9-29-2】重载函数模板示例。重载函数模板示例。源程序代码源程序代码#include#include#include#include using namespace st
17、d;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页第十四页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.1 函数模板函数模板重载重载函数模板函数模板T Max(T a,T b,T c)T t;t=Max(a,b);return Max(t,c);int Max(int a,char b)return ab?a:b;/Cint main(
18、)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页第十五页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.1 函数模板函数模板重载重载函数模板函数模板 例例9-29-2在调用时,首先
19、寻找和使用最符合函数在调用时,首先寻找和使用最符合函数名和参数类型的函数,若找到则调用它,如名和参数类型的函数,若找到则调用它,如D D行行调用调用C C行定义的函数;行定义的函数;否则,寻找一个函数模否则,寻找一个函数模板,将其实例化产生一个匹配的模板函数,若板,将其实例化产生一个匹配的模板函数,若找到则调用它,如找到则调用它,如E E行调用行调用A A行定义的函数模板,行定义的函数模板,F F行调用行调用B B行定义的函数模板。行定义的函数模板。第16页/共63页第十六页,编辑于星期五:十二点 三十七分。第第9章章 模板和异常处理模板和异常处理9.1 函数模板函数模板重载重载函数模板函数模
20、板 一般地在一般地在C+C+语言中函数模板与同名的非模板函数重载语言中函数模板与同名的非模板函数重载时,遵循下列调用原则:时,遵循下列调用原则:(1 1)寻找一个与参数完全匹配的函数,若找到就调用它。)寻找一个与参数完全匹配的函数,若找到就调用它。若参数完全匹配的函数多于一个,则这个调用将是一个错若参数完全匹配的函数多于一个,则这个调用将是一个错误的调用。误的调用。(2 2)寻找一个函数模板,若找到就将其实例化,生成一)寻找一个函数模板,若找到就将其实例化,生成一个匹配的模板函数并调用它。个匹配的模板函数并调用它。(3 3)若上面两条都失败,则使用函数重载的方法,通)若上面两条都失败,则使用函
21、数重载的方法,通过类型转换产生参数匹配,若找到就调用它。过类型转换产生参数匹配,若找到就调用它。(4 4)若上面)若上面3 3条都失败,即没有找到都匹配的函数,则这个条都失败,即没有找到都匹配的函数,则这个调用是一个错误的调用,系统将报错。调用是一个错误的调用,系统将报错。第17页/共63页第十七页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的定义类模板的定义 类模板类模板用于实现类所需数据的类型参数化。类模板在表示用于实现类所需数据的类型参数化。类模板在表示如数组、表、图等数据结构时显得特别重要,这些数据结构如数组、表
22、、图等数据结构时显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响。的表示和算法不受所包含的元素类型的影响。类模板定义的一般格式为:类模板定义的一般格式为:template template T class class 类名类名 /类体类体 ;这里关键字这里关键字templatetemplate、typenametypename(或用(或用classclass)及)及T T与函数模与函数模板定义中的类似。板定义中的类似。第18页/共63页第十八页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的定义类模板的定义
23、 类模板定义中,凡要采用类型参数类模板定义中,凡要采用类型参数T T的数据成员、成员函的数据成员、成员函数的参数或函数类型前都要加上类型标识符数的参数或函数类型前都要加上类型标识符T T。如果类模板中。如果类模板中的成员函数要在类外定义,则它必须是函数模板。其定义的成员函数要在类外定义,则它必须是函数模板。其定义的一般格式为:的一般格式为:templatetemplate T 函数类型函数类型 类名类名:成员函数名成员函数名(形参列表形参列表)函数体函数体 类模板使类中的数据成员和成员函数的参数或返回值可类模板使类中的数据成员和成员函数的参数或返回值可以取任意的数据类型。它不是一个具体的类,而
24、是代表着以取任意的数据类型。它不是一个具体的类,而是代表着一簇类,是这一簇类的统一模式。一簇类,是这一簇类的统一模式。第19页/共63页第十九页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的定义类模板的定义【例【例9-39-3】定义一个包含两个私有数据成员、一个构造定义一个包含两个私有数据成员、一个构造函数和一个输出成员函数的类模板。函数和一个输出成员函数的类模板。源程序代码源程序代码 template template /A/A class AA class AA private:private:T1 i;T1 i;/
25、B/B T2 j;T2 j;public:public:AA(T1 a,T2 b);AA(T1 a,T2 b);void print();void print();第20页/共63页第二十页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的定义类模板的定义 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=ic
26、outi=i ,j=jendl;,j=jendl;例例9-39-3中的中的A A行为定义类模板,注意行末不能加分号,因行为定义类模板,注意行末不能加分号,因为它要和下面的类定义构成一个整体;为它要和下面的类定义构成一个整体;B B行定义了类的一个行定义了类的一个私有数据私有数据i i;C C行和行和D D行合在一起构成了在类外定义行合在一起构成了在类外定义AAAA类类的构造函数的构造函数AAAA;同样;同样printprint函数前的函数模板定义也不能少。函数前的函数模板定义也不能少。第21页/共63页第二十一页,编辑于星期五:十二点 三十七分。使用类模板就是要将它实例化为具体的类,将类模板的
27、模板参数实例使用类模板就是要将它实例化为具体的类,将类模板的模板参数实例化后生成的具体类,称为模板类。模板类是一个实实在在的类。利用类化后生成的具体类,称为模板类。模板类是一个实实在在的类。利用类模板可以产生多种不同的模板类。如利用例模板可以产生多种不同的模板类。如利用例9-39-3中的类模板中的类模板AAAA,可以,可以产生多个模板类,例举其中一部分:产生多个模板类,例举其中一部分:AA AA;/第一个参数是第一个参数是int,int,第二个参数也是第二个参数也是intint AA AA;/第一个参数是第一个参数是int,int,第二个参数是第二个参数是charchar AAAA,char
28、AAAA,char /第一个参数是具有第一个参数是具有AAAA类的类型,第二个参数是类的类型,第二个参数是charchar AA AA /第一个参数是指向第一个参数是指向intint的指针类型,第二个参数是的指针类型,第二个参数是intint2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的使用类模板的使用第22页/共63页第二十二页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的使用类模板的使用 有了确定类型的模板类后,就能利用它来创有了确定类型的模板类后,就能利用它来创建类的实例,即
29、产生类的对象。其定义的一般建类的实例,即产生类的对象。其定义的一般格式如下:格式如下:类名类名 对象名对象名1(1(实参列实参列1)1),对象名,对象名2(2(实参列实参列2)2),对象名,对象名n(n(实参列实参列n)n);其中,类名其中,类名 为实例化的模为实例化的模板类。系统会先创建一个具体的模板类,再板类。系统会先创建一个具体的模板类,再生成该模板类(具体类)的对象。生成该模板类(具体类)的对象。第23页/共63页第二十三页,编辑于星期五:十二点 三十七分。2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的使用类模板的使用【例【例9-49-4】定义定
30、义9-39-3例中的模板类并生成对象,在主例中的模板类并生成对象,在主函数中完成对相关成员函数的调用测试。函数中完成对相关成员函数的调用测试。程序设计程序设计 在主函数中定义模板类并生成对象,在主函数中定义模板类并生成对象,利用对象调用成员函数来完成对定义类的测试。利用对象调用成员函数来完成对定义类的测试。第24页/共63页第二十四页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23第第9章章 模板和异常处理模板和异常处理9.2 类模板类模板类模板的使用类模板的使用 源程序代码源程序代码int main()int main()AA a1(3,5);AA a1(3,5);/实例化
31、类模板并生成实例化类模板并生成a1a1对象对象 a1.print();a1.print();/调用调用a1a1对象的成员函数对象的成员函数printprint AA a2(4,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页第二十五页,编辑于星期五:十二点 三十七
32、分。谢谢各位专家!2023/3/23第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理 异常异常是指是指C+C+语言运行时产生的错误,它是由大量语言运行时产生的错误,它是由大量的例外情况产生的,例如内存用尽,不能打开文件,使的例外情况产生的,例如内存用尽,不能打开文件,使用不合适的值初始化对象等等。用不合适的值初始化对象等等。异常处理的任务异常处理的任务是在程序设计时,事先分析程序运是在程序设计时,事先分析程序运行时可能出现的各种意外情况,分别制订出相应的处行时可能出现的各种意外情况,分别制订出相应的处理方法。理方法。异常处理的基本思想异常处理的基本思想是将异常的检测与处理分离。
33、当在是将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但却无法确定相应的处一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数将引发一个异常,由函数的直接或间接调理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。用者捕获这个异常并处理这个错误。第26页/共63页第二十六页,编辑于星期五:十二点 三十七分。谢谢各位专家!异常处理的机制异常处理的机制2023/3/23第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理 异常处理的机制为抛出异常、捕获异常和处理异常。异常处理的机制为抛出异常、捕获异常和处理异常。C+C+语语言
34、中使用言中使用throwthrow抛出异常,使用抛出异常,使用trycatchtrycatch捕获和处理异常。其捕获和处理异常。其处理过程如下:处理过程如下:(1 1)设置异常块并抛出。将可能出现错误或异常的代)设置异常块并抛出。将可能出现错误或异常的代码块设置成被监视代码块,在发生异常时用码块设置成被监视代码块,在发生异常时用throwthrow将该块将该块抛出,称为抛出一个异常。抛出,称为抛出一个异常。(2 2)将被监视代码块放到)将被监视代码块放到trytry结构中进行监视。结构中进行监视。(3 3)若被监视代码块抛出异常,进入)若被监视代码块抛出异常,进入catchcatch结构进行处
35、理。结构进行处理。第27页/共63页第二十七页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理1 1throwthrow语句语句 当某段程序发现了自己不能处理的异常,就可以使用当某段程序发现了自己不能处理的异常,就可以使用throwthrow语句将这个异常抛掷给调用者。语句将这个异常抛掷给调用者。throwthrow语句的一般格式为:语句的一般格式为:throw throw ;throw throw语句的使用与语句的使用与returnreturn语句相似,如果程序中有多处要语句相似,如
36、果程序中有多处要抛掷异常,应该用不同的表达式类型来互相区别,称为抛掷异常,应该用不同的表达式类型来互相区别,称为异异常类型常类型。表达式的值不能用来区别不同的异常。表达式的值不能用来区别不同的异常。第28页/共63页第二十八页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理如:如:throw 1;throw 1;/A/A throw 1;throw 1;/B/B throw “number error”;throw “number error”;/C/C A A行抛出一个异常,该异常为
37、行抛出一个异常,该异常为intint类型,值为类型,值为1 1;B B行抛出一行抛出一个异常,该异常为个异常,该异常为charchar类型,值为字符型数据类型,值为字符型数据1 1;C C行抛行抛出一个异常,该异常为出一个异常,该异常为char*char*类型,值为字符串的首地址。在执类型,值为字符串的首地址。在执行完行完throwthrow语句后,系统将不执行语句后,系统将不执行throwthrow后面的语句,而是直后面的语句,而是直接跳到异常处理语句部分进行异常处理。接跳到异常处理语句部分进行异常处理。第29页/共63页第二十九页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3
38、/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理2trycatch块语句块语句 如果预料某段程序代码(或对某个函数的调用)有可能发生如果预料某段程序代码(或对某个函数的调用)有可能发生异常,就将它放在异常,就将它放在try语句之后。如果这段代码(或被调函语句之后。如果这段代码(或被调函数)运行时真的遇到异常情况,其中的数)运行时真的遇到异常情况,其中的throw表达式就会表达式就会抛掷这个异常。抛掷这个异常。try块语句的一般格式为:块语句的一般格式为:try /可能抛出异常的语句序列可能抛出异常的语句序列 catch(异常类型名异常类型名 异
39、常对象名异常对象名)/异常处理代码异常处理代码 第30页/共63页第三十页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理 若若trytry内的代码中有用内的代码中有用throwthrow语句抛出的一个异常,则在语句抛出的一个异常,则在throwthrow语句执行后,立即跳转到语句执行后,立即跳转到trytry后的后的catchcatch块列表中,查找异块列表中,查找异常类型名和抛出的异常对象的类型相同的常类型名和抛出的异常对象的类型相同的catchcatch块。块。若找到,将抛出的异
40、常对象值赋给对应若找到,将抛出的异常对象值赋给对应catchcatch块的异常对块的异常对象,并进入象,并进入catchcatch块执行(类似函数调用过程)。块执行(类似函数调用过程)。执行完执行完catchcatch块代码后,系统跳到块代码后,系统跳到trycatchtrycatch后面的语句后面的语句进行执行。进行执行。第31页/共63页第三十一页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理关于异常处理使用有如下几点说明:关于异常处理使用有如下几点说明:(1 1)trytry块
41、和块和catchcatch块作为一个整体出现,块作为一个整体出现,catchcatch块是块是trycatchtrycatch块的一部分,不可以单独使用,两者之间不能插块的一部分,不可以单独使用,两者之间不能插入其他语句。入其他语句。(2 2)trytry块和块和catchcatch块中必须用花括号括起来,即使花括号块中必须用花括号括起来,即使花括号内只有一个语句,也不可以省略花括号。内只有一个语句,也不可以省略花括号。第32页/共63页第三十二页,编辑于星期五:十二点 三十七分。2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理(3
42、 3)trycatchtrycatch块语句中只能有一个块语句中只能有一个trytry块,但后可跟多个块,但后可跟多个catchcatch块,以便与不同的异常信息相匹配。此时按照块,以便与不同的异常信息相匹配。此时按照catchcatch块出块出现的先后顺序,查找异常类型名和抛出的异常对象的类型现的先后顺序,查找异常类型名和抛出的异常对象的类型相同的相同的catchcatch块。所有同级别的块。所有同级别的catchcatch块语句只能有一条被执块语句只能有一条被执行,不存在两条被同时执行的情况。行,不存在两条被同时执行的情况。(4 4)如果在)如果在catchcatch语句块代码中,异常类型
43、名部分的形式语句块代码中,异常类型名部分的形式为省略号(为省略号(),即写成),即写成catch catch(),系统将该省略号),系统将该省略号处理成处理成“通配符通配符”,表示捕获所有类型的异常,并且,此,表示捕获所有类型的异常,并且,此形式只能位于同级别的形式只能位于同级别的catchcatch语句的最后位置。语句的最后位置。第33页/共63页第三十三页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理(5 5)trycatchtrycatch语句块是可以嵌套的。语句块中的语句块是
44、可以嵌套的。语句块中的trytry块和块和catchcatch块也可以不在同一个函数中,当用块也可以不在同一个函数中,当用throwthrow抛出异常信息抛出异常信息时,首先在本函数中寻找与之匹配的时,首先在本函数中寻找与之匹配的catchcatch块,如果本函数块,如果本函数中找不到,就转到上一层去处理,再找不到,则转到更上一层去中找不到,就转到上一层去处理,再找不到,则转到更上一层去处理,直至找到后处理。如果一直找不到,系统会调用一个系统处理,直至找到后处理。如果一直找不到,系统会调用一个系统函数函数terminateterminate,使程序终止运行。,使程序终止运行。(6 6)thro
45、wthrow语句也可以这样用:语句也可以这样用:throw;throw;此时表示不处理这个异常,交给上级处理,即将当前正在处理的此时表示不处理这个异常,交给上级处理,即将当前正在处理的异常信息再次抛出,给其上一层的异常信息再次抛出,给其上一层的catchcatch块处理。块处理。第34页/共63页第三十四页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理【例【例9-59-5】试分析下面程序的输出结果。】试分析下面程序的输出结果。#include#includeusing namespa
46、ce std;using namespace std;int main()int main()try try cout“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“*”endl;cout“*”endl;/D/D 第35页/共63页第三十五页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的
47、实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理 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
48、is end!Test is end!第36页/共63页第三十六页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23异常处理的异常处理的实现实现第第9章章 模板和异常处理模板和异常处理9.3 异常处理异常处理 例例9-59-5程序是由一个程序是由一个trytry块和块和3 3个个catchcatch块语句构成,且块语句构成,且3 3个个catchcatch块语句是并列的。程序的执行按从上往下的顺序依次进行,块语句是并列的。程序的执行按从上往下的顺序依次进行,当执行到当执行到A A行时,行时,throwthrow语句抛出了一个异常,这个异常的数据语句抛出了一个异常,这个异常的数据
49、类型是类型是intint,值为,值为1 1。程序转而去执行程序转而去执行catchcatch语句,而程序中的语句,而程序中的B B行将不会执行。行将不会执行。接着按照从上往下的顺序找接着按照从上往下的顺序找catchcatch块语句中的数据类型和块语句中的数据类型和throwthrow抛出的数据类型相同的,例抛出的数据类型相同的,例9-59-5首先判断首先判断C C行中的行中的catchcatch块块语句中的数据类型是不是语句中的数据类型是不是intint,结果不是。然后找到第二个,结果不是。然后找到第二个catchcatch块语句,即程序中的块语句,即程序中的E E行,结果类型相同,并且有一
50、个行,结果类型相同,并且有一个变量变量a a。第37页/共63页第三十七页,编辑于星期五:十二点 三十七分。谢谢各位专家!2023/3/23 系统将对系统将对a a进行赋值,即进行赋值,即a=1a=1;程序继续执行;程序继续执行F F行,并输出行,并输出a a的值。结束整个的值。结束整个trycatchtrycatch块语句的执行。块语句的执行。G G行行catchcatch语句中的语句中的“异常类型名异常类型名”表示为省略号的形式,表示为省略号的形式,即表示捕获所有的异常,注意是从上往下查找即表示捕获所有的异常,注意是从上往下查找catchcatch语句语句时,找不到匹配的数据类型,系统将执