




已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章模板和异常处理,9.1模板,1,在实际程序设计过程中,往往会发现这样的现象:程序中所定义的两个或多个函数的函数体完全一样,所不同的只是它们的参数类型不一样。,2,求两个整型数的最小值,intiMin(intx,inty)intmv;mv=(xy)?x:y;returnmv;,3,求两个浮点型数的最小值,floatfMin(floatx,floaty)floatmv;mv=(xy)?x:y;returnmv;,4,由上述两个函数的定义不难看出,除了所要处理的数据类型不同以外,两个函数体中的语句部分完全相同。,结论,5,在C+语言中,对这样的两个函数可以先给出其通用的框架定义,而将其参数类型作为可变化的部分来进行处理,当需要调用这样的函数时,再将具体的参数及其类型传送给它,这就是模板的概念。,模板的概念,6,模板的定义,所谓模板,就是首先定义作为原型的函数或类的框架,然后在需要时再根据已定义的原型来生成具体的函数或类。,7,模板的类型,在C+语言中,模板分为两种:函数模板类模板,8,9.1.1函数模板,函数模板的定义形式如下:template函数值类型函数名(参数表)函数体,9,这里,template为定义模板的关键字,用于指定在实际调用时可以进行替换的参数类型名,其格式为:这里的class为关键字,T1、T2、Tn为用户自己命名的以后需要替换的类型名。,说明,10,说明,“函数值类型”是模板函数的返回值类型,既可以是已有的类型名,如int、double等,也可以是在中给出的类型名,如T1、T2等。同样,“参数表”和“函数体”中所使用的数据类型名既可以是已有的类型名,也可以是在中给出的类型名。,11,求a、b最小值的函数模板的定义,templateTmindt(Tx,Ty)Tmvmv=(xy)?x:y;returnmv;,12,在上面函数模板的描述中,T为类型参数,它表示在以后要用指定的数据类型名来进行替换。这也就是说,有了上面的模板定义之后,我们就可以利用它来求任何基本类型数据的最小值了。,13,【例9.1】编一程序,利用模板来求两个数的最小值。,#includetemplateTmindt(Tx,Ty)Tmv;mv=(xy)?x:y;returnmv;,14,voidmain()intidt;doubleddt;idt=mindt(1000,2000);/生成int类型的mindt()函数,并调用之ddt=mindt(3.33,4.44);/生成double类型的mindt()函数,并调用之cout“idt=”idtn;cout“ddt=”ddtn;,15,程序的执行结果如下:idt=1000ddt=3.33,16,说明,(1)从此例不难看出,同一个模板函数,可以适用于不同的数据类型。另外,由于函数重载是每重载一个函数都要定义其函数实体,所以模板同函数重载也是不同的。,17,(2)具有多个参数的模板可定义如下:templateT1func(T1a,T2b),18,(3)在调用模板函数时,系统能自动根据所给定的参数类型来生成相应的函数,并进行调用。,19,9.1.2类模板,在C+语言中,不但可以定义函数模板,而且还可以定义类模板。下面,我们看一下能够保存100个整数的堆栈类的设计,通过对这样一个简单例子的学习,来了解一下使用类模板的意义。,20,【例9.2】编一程序,用于实现能够管理整型数据的堆栈类。,#includeclasscStackintct;intdata100;,21,public:cStack(void)ct=0;voidpush(intdt)if(ct0)returndata-ct;elsereturn0;,22,voidmain()inta,b;cStackist;ist.push(100);ist.push(200);a=ist.pop();b=ist.pop();cout“a=”an“b=”bn;,23,程序的执行结果如下:a=200b=100,24,说明,这里设计的cStack类,只能用于管理整型数据,这是由于类中的每一个数据成员的类型都是固定的,这样,要想处理其它类型的数据就必须重新设计一个新类。,25,为了使cStack类能够处理各种基本数据类型,我们可以使用类模板来定义类的框架,在需要时再根据所提供的类型参数来生成相应的类。,26,类模板的定义形式,templateclass类名数据成员成员函数;,27,其中,template为定义模板的关键字,用于指定在实际调用时可以进行替换的参数类型名,其格式为:这里的class为关键字,T1、T2、Tn为用户自己命名的以后需要替换的类型名。既可以利用已有的类型名来定义类中的数据成员,也可以利用在的T1、T2等来定义类中的数据成员。,28,【例9.3】编一程序,利用类模板来实现堆栈数据结构的管理。,#includetemplateclasscStackintct;Tdata100;,29,cStack(void)ct=0;voidpush(Tdt)if(ct0)returndata-ct;elsereturn0;,30,voidmain()inta,b;doublec,d;cStackist;cStackdst;ist.push(100);ist.push(200);a=ist.pop();b=ist.pop();,31,dst.push(33.33);dst.push(44.44);c=dst.pop();d=dst.pop();cout“a=”an“b=”bn;cout“c=”cn“d=”d0)returndata-ct;elsereturn0;,36,在实际程序设计过程中经常会使用模板,正确地使用模板来进行程序设计能够减少程序设计工作量,提高程序的正确性和可维护性。,37,9.2异常处理,异常处理又被称为例外处理。所谓异常处理是指出现非正常情况时的处理,绝大部分情况是指错误处理。,38,在C语言中,一般是将错误处理代码同一般的程序代码混在一起,这样,在结构不好的C语言程序中,往往到处都可以看到exit()函数。在C+语言中,对异常处理是通过一个特定的结构来进行的。,39,下面的C语言程序是用来判断命令行参数的个数是否为1,如果不为1则显示错误信息。,40,intmain(intargc,char*argv)if(argc!=2)printf(“Error:parametererror!n”);exit(1);return0;,41,上述程序若用C+语言来编写,则可改为如下形式:,intmain(intargc,char*argv)tryif(argc!=2)throw“Error:parametererror!n”;,42,catch(char*err)couterrmonth;,57,tryif(month12)throw“Error:Monthisbiggerthan12”;,58,catch(char*errstr)couterrstrn;return1;coutmonth;,62,tryif(month12)throw2;,63,catch(interrno)if(errno=1)cout“Error:monthislessthan1”n;elseif(errno=2)cout“Error:monthisbiggerthan12”n;return1;cout“End”;return0;,64,程序的执行结果1:Inputmonth:0Error:monthislessthan1程序的执行结果2:I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论