最新C C++语言程序设计第13章 模板(共38张PPT课件).pptx
-
资源ID:24506508
资源大小:230.75KB
全文页数:38页
- 资源格式: PPTX
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
最新C C++语言程序设计第13章 模板(共38张PPT课件).pptx
第第1313章章 模模 板板 第一页,共三十八页。2022-7-5第二页,共三十八页。2022-7-5l求两个数据中最小值的函数求两个数据中最小值的函数min()的实现过程。其中,的实现过程。其中,a和和b可以是整型、实型,当然也可以是用户可以是整型、实型,当然也可以是用户(yngh)定义定义的数据类型。的数据类型。C+是强类型语言,参数是强类型语言,参数a和和b的类型在的类型在编译时就必须声明。因此需要对不同的数据类型分别编译时就必须声明。因此需要对不同的数据类型分别定义不同的版本。定义不同的版本。 1. 模板模板(mbn)的作的作用用 int min(int a, int b) /求两个整数中的最小值求两个整数中的最小值 int temp; temp=ab?a:b; return temp; float min(float a, float b) /求两个实型数据中的最小值求两个实型数据中的最小值 float temp; temp=ab?a:b; return temp; 第三页,共三十八页。l使用模板,把使用模板,把数据类型数据类型本身作为一个本身作为一个参数参数(cnsh),这样就可以使用一套代码完成不同数据类型的数,这样就可以使用一套代码完成不同数据类型的数据交换,实际上也使编程趋于标准化。与声明和定据交换,实际上也使编程趋于标准化。与声明和定义通常不在一起的普通函数不同,函数模版的定义义通常不在一起的普通函数不同,函数模版的定义紧接其声明之后。其格式如下:紧接其声明之后。其格式如下:template 返回值类型返回值类型 函数名函数名 (形参表)(形参表)/函数体函数体关键字不能省略参数项由关键字class后跟一个标识符组成第四页,共三十八页。编写编写(binxi)函数模板的方法是:函数模板的方法是:第一步第一步:定义一个普通的函数,数据类型采用具体:定义一个普通的函数,数据类型采用具体的普通的数据类型。的普通的数据类型。第二步第二步:将数据类型参数化:将其中需要使用到的具:将数据类型参数化:将其中需要使用到的具体数据类型名体数据类型名(如如 int )全部替换成由自己定义的抽象全部替换成由自己定义的抽象的类型参数名的类型参数名(如如T)。第三步第三步:在函数头前用关键字:在函数头前用关键字template引出对类型参引出对类型参数名的声明。这样就把一个具体的函数改造成一个通数名的声明。这样就把一个具体的函数改造成一个通用的函数模板:用的函数模板:第五页,共三十八页。【例例13.1】 用模板实现用模板实现(shxin)求两数中最小值函数求两数中最小值函数min( )。第六页,共三十八页。程序程序(chngx)输出结果为输出结果为:min(10,20)=10min(8.7,5.4)=5.4第七页,共三十八页。说明:说明:(1)虽然函数)虽然函数(hnsh)模板中的类型参数模板中的类型参数T可以被实例可以被实例化为各种类型,其实际类型取决于模板函数给出的化为各种类型,其实际类型取决于模板函数给出的实参类型。但是,实参类型。但是,实例化实例化T的各模板函数的实参之间的各模板函数的实参之间必须保持完全一致的类型,否则会出现语法错误。必须保持完全一致的类型,否则会出现语法错误。第八页,共三十八页。【例例13.2 】分析下面分析下面(xi mian)程序的运行结果。程序的运行结果。第九页,共三十八页。第十页,共三十八页。l(2)区分两个术语)区分两个术语函数模板函数模板和和模板函数模板函数。其中。其中函函数模板是对一组函数的描述数模板是对一组函数的描述,它不是一个实实在在,它不是一个实实在在的函数,编译系统并不产生任何执行代码;而的函数,编译系统并不产生任何执行代码;而模板模板函数则是类型参数函数则是类型参数(cnsh)实例化之后的函数实例化之后的函数。它们俩。它们俩之间的关系就好像类与对象的关系。之间的关系就好像类与对象的关系。第十一页,共三十八页。l(3)模板函数与重载是密切相关的。从函数模板产生)模板函数与重载是密切相关的。从函数模板产生的的模板函数都是同名的模板函数都是同名的,因此编译器采用重载的,因此编译器采用重载的解决方法调用相应函数。注意,模板函数虽然类解决方法调用相应函数。注意,模板函数虽然类似于重载函数,但它要更严格一些。函数被重载似于重载函数,但它要更严格一些。函数被重载时,在每个函数体内时,在每个函数体内(t ni)可以执行不同的动作,但可以执行不同的动作,但同一函数模板实例化后的所有模板函数都必须执行同一函数模板实例化后的所有模板函数都必须执行相同的动作。相同的动作。第十二页,共三十八页。【例例13.3 】分析分析(fnx)以下程序的运行结果。以下程序的运行结果。第十三页,共三十八页。第十四页,共三十八页。第十五页,共三十八页。执行程序后,输出执行程序后,输出(shch)结果为:结果为:The sum of integer array is: 0The sum of double array is: 0The sum of integer array and double array is: 57.6The sum of two strings is: How are you?第十六页,共三十八页。在在C+编译时,函数模板和同名的非模板函数重载时编译时,函数模板和同名的非模板函数重载时,编译器通过如下的匹配,编译器通过如下的匹配(ppi)过程确定调用哪一个函数过程确定调用哪一个函数:(1)先去匹配最符合函数名和参数类型的函数调用,先去匹配最符合函数名和参数类型的函数调用,即优先即优先调用对应的一般函数(非模板函数)调用对应的一般函数(非模板函数)。如果参数完全。如果参数完全匹配,则调用重载函数。匹配,则调用重载函数。(2)如果重载函数的参数类型不匹配,则去匹配函数模板如果重载函数的参数类型不匹配,则去匹配函数模板,将其实例化产生一个匹配的模板函数,如果匹配成,将其实例化产生一个匹配的模板函数,如果匹配成功,则调用此模板函数。功,则调用此模板函数。第十七页,共三十八页。(3)如果模板函数匹配不成功,编译器尝试通过类型转换,如果模板函数匹配不成功,编译器尝试通过类型转换,来检验调用是否和重载函数匹配来检验调用是否和重载函数匹配,如果是,则调用重,如果是,则调用重载函数。载函数。(4)如果上述操作如果上述操作(cozu)均不能进行,则产生编译错误均不能进行,则产生编译错误。如果最后得到了多于一种选择,那么这个函数调用有如果最后得到了多于一种选择,那么这个函数调用有二义性,指出是一种错误的函数调用。二义性,指出是一种错误的函数调用。第十八页,共三十八页。 类模板可以让用户为类声明一种模式,使得类中的某些类模板可以让用户为类声明一种模式,使得类中的某些数据成员、某些成员函数数据成员、某些成员函数(hnsh)的参数、某些成员函数的参数、某些成员函数(hnsh)的返回值能取任意类型。的返回值能取任意类型。定义定义(dngy)类模板的格式为:类模板的格式为:template class 类名类名/类体类体;第十九页,共三十八页。如果需要在类模板以外如果需要在类模板以外(ywi)定义其成员函数,则要采定义其成员函数,则要采用以下的形式:用以下的形式:template返回值类型返回值类型 类名类名(li mn):函数名函数名(参数表参数表) /函数体函数体第二十页,共三十八页。 类模板不代表一个具体的、实际的类,而代表类模板不代表一个具体的、实际的类,而代表若干个具有相同特性的类,它是生成类的样板。若干个具有相同特性的类,它是生成类的样板。实际上,类模板的使用就是将类模板实例化为一实际上,类模板的使用就是将类模板实例化为一个个具体的类,即模板类,然后再通过个个具体的类,即模板类,然后再通过(tnggu)模板模板类建立对象。类建立对象。 说明模板类对象的格式为:说明模板类对象的格式为: 对象对象1, ,对象对象n;第二十一页,共三十八页。【例例13.4】堆栈堆栈(duzhn)类模板类模板Stack的使用。的使用。第二十二页,共三十八页。第二十三页,共三十八页。第二十四页,共三十八页。第二十五页,共三十八页。第二十六页,共三十八页。程序运行结果如下程序运行结果如下(rxi):-整数堆栈整数堆栈-2431-浮点数堆栈浮点数堆栈-3.42.55.22.1第二十七页,共三十八页。【例例13.5】使用类模板,编写一个对数组进行排序、使用类模板,编写一个对数组进行排序、查找和求元素和的程序。查找和求元素和的程序。 设计设计(shj)一个类模板一个类模板templateclass Array,用于对,用于对T类型的数组进行排序、查找和求类型的数组进行排序、查找和求元素和,然后由此产生模板类元素和,然后由此产生模板类Array和和Array。 第二十八页,共三十八页。第二十九页,共三十八页。第三十页,共三十八页。第三十一页,共三十八页。第三十二页,共三十八页。第三十三页,共三十八页。第三十四页,共三十八页。第三十五页,共三十八页。程序的执行结果程序的执行结果(ji gu)为:为: 序列序列1: 原序列:原序列:6 3 8 1 9 4 7 5 2 8在序列在序列1中的位置:中的位置:3 排序后:排序后:1 2 3 4 5 6 7 8 9 序列序列2: 原序列:原序列:2.3 6.1 1.5 8.4 6.7 3.8 8.4在序列在序列2中的位置:中的位置:4 排序后:排序后:1.5 2.3 3.8 6.1 6.7 8.4 第三十六页,共三十八页。l模板的概念;模板的概念;l函数函数(hnsh)模板和模板函数模板和模板函数(hnsh)的定义与应的定义与应用;用;l类模板与模板类的定义与应用类模板与模板类的定义与应用第三十七页,共三十八页。内容(nirng)总结C/C+语言程序设计。C+是强类型语言,参数a和b的类型在编译时就必须声明(shngmng)。【例13.1】 用模板实现求两数中最小值函数min( )。min(10,20)=10。min(8.7,5.4)=5.4。char *p2=are you。p1=Sum(p1,p2)。void push(T a)。【例13.5】使用类模板,编写一个对数组进行排序、查找和求元素和的程序。int seek(T key)。模板的概念第三十八页,共三十八页。