资源预览内容
第1页 / 共71页
第2页 / 共71页
第3页 / 共71页
第4页 / 共71页
第5页 / 共71页
第6页 / 共71页
第7页 / 共71页
第8页 / 共71页
第9页 / 共71页
第10页 / 共71页
亲,该文档总共71页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
高级语言程序设计C+,张海威 南开大学信息技术科学学院,第9章 模板,函数模板,1,类模板,2,类模板若干问题的说明,3,综合示例,4,2,Database & Information System Lab,第9章 模板,函数模板,1,类模板,2,类模板若干问题的说明,3,综合示例,4,3,Database & Information System Lab,函数模板,通常设计的算法(处理语句)是可以处理多种数据类型的,但目前处理相同的问题,仍要分别定义多个类似的函数 【例如】,Database & Information System Lab,4,int max (int a, int b) if(ab) return a; else return b; ,double max (double a, double b) if(ab) return a; else return b; ,char max (char a, char b) . .,函数模板,实际上,若“提取”出一个可变化的类型参数T,则可“综合”成为如下的同一个函数(即函数模板),它实际上代表着一组函数 T max (T a, T b) if(ab) return a; else return b; ,Database & Information System Lab,5,函数模板,在C+中定义完整的函数模板max时,格式如下 template T max (T a, T b) if(ab) return a; else return b; ,Database & Information System Lab,6,函数模板,函数模板定义的一般格式为: template 返回类型 函数模板名(形参表) 函数体 注意: 应在“返回类型”或“形参表”或“函数体”中使用上述的“类型形参名” 。 调用处则类似于一般函数,用户只需给出具体的实参。 模板函数调用时,不进行实参到形参类型的自动转换。 从物理意义上,函数模板类似于重载,Database & Information System Lab,7,函数模板,【例9.1】定义一个函数模板max,而后对它进行不同的调用 #include template T max (T a, T b) if(ab) return a; else return b; ,Database & Information System Lab,8,函数模板,void main() int i1=-11, i2=0; double d1, d2; coutd1d2; coutmax(d1,d2)endl; /cout“max(23,-5.6) = “max(23,-5.6)endl; /出错! 不进行实参到形参类型的自动转换 ,Database & Information System Lab,9,函数模板,程序执行后的显示结果如下: int i1=-11, i2=0; = max(i1,i2) = 0 max(23,-56) = 23 char c1=T, c2=F; = max(c1,c2) = T max(f, k) = k input double d1, d2 : 123.45 99.67 d1=123.45, d2=99.67 = max(d1,d2) = 123.45,Database & Information System Lab,10,函数模板,【例9.2】定义一个函数模板与一个函数,它们都叫做min,C+允许这种函数模板与函数同名的所谓重载使用方法。但注意,在这种情况下,每当遇见函数调用时,C+编译器都将首先检查是否存在重载函数,若匹配成功则调用该函数,否则再去匹配函数模板,Database & Information System Lab,11,函数模板,#include #include template type min (type a, type b) /type型的a与b要能够进行“”比较运算! return (ab?a:b); char* min (char* a, char* b) /函数min,字符串型参数,不能直接使用“”来进行 /比较 return (strcmp(a,b)0?a:b); ,Database & Information System Lab,12,函数模板,void main() coutmin(3,-10)endl; /使用函数模板 coutmin(2.5,99.5)endl; coutmin(m,c)endl; char* str1=“The C program“, * str2=“The C+ program“; coutmin(str1, str2)endl; /使用重载函数! ,Database & Information System Lab,13,函数模板,【例9.3】定义两个函数模板,它们都叫做sum,都使用了一个类型参数Type,但两者的形参个数不同,C+允许使用这种函数模板重载的方法。 注意,参数表中允许出现与类型形参Type无关的其它类型的参数,如“int size”。,Database & Information System Lab,14,函数模板,#include template Type sum (Type * array, int size ) /求array数组前size个元素之和 Type total=0; for (int i=0;isize;i+) total+=*(array+i); return total; ,Database & Information System Lab,15,函数模板,template Type sum (Type * a1, Type * a2, int size ) /求a1数组与a2数组前size个元素之和 Type total=0; for (int i=0;isize;i+) total+=a1i+a2i; return total; ,Database & Information System Lab,16,函数模板,void main() int a110,a28; float af10; . /为数组分量定值 coutsum(a1,10)endl; /求出a1数组前10个元素之和并输出 coutsum(af,10)endl; coutsum(a1,a2,8)endl; /求a1与a2数组前8个元素之和并输出 ,Database & Information System Lab,17,函数模板,【作业9.1】编写函数模板,实现将n个数据进行由小到大排序的功能 排序算法自行选择 能够处理的数据类型包括: 整型 浮点型 字符型 自定义类型,如复数类型(选做),Database & Information System Lab,18,第9章 模板,函数模板,1,类模板,2,类模板若干问题的说明,3,综合示例,4,19,Database & Information System Lab,类模板,类模板(带类型参数或普通参数的类)用来定义具有共性的一组类 “共性”通过类模板参数体现 通过类模板的定义,类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值都可以是任意类型的 可将程序所处理的对象(数据)的类型参数化,从而使同一段程序可用于处理多种不同类型的对象(数据),Database & Information System Lab,20,类模板,类模板的定义方式 template class 类模板名 带上述类型形参或普通形参名的类定义体 ; 类型形参 class 类型形参名 普通形参 数据类型 普通形参名 类模板名 标识符,Database & Information System Lab,21,类模板,类模板的说明 类定义体中应使用上述的“类型形参名”及“普通形参名”。 利用类模板说明类对象时,要随类模板名同时给出对应于类型形参或普通形参的具体实参(从而实例化为一个具体的类)。说明格式为: 类模板名 注意:类型形参的相应实参为类型名,而普通形参的相应实参必须为一个常量。,Database & Information System Lab,22,类模板,类模板的成员函数 类模板的成员函数既可以在类体内进行说明(自动按内联函数处理),也可以在类体外进行说明。 在类体外说明(定义)时使用如下格式: template 返回类型 类模板名 :函数名( 形参表 ) . /函数体 ;,Database & Information System Lab,23,类模板,类模板的成员函数 上述的“形参1的名字”来自于“形参1的说明”,由“甩掉”说明部分的“类型”而得,是对类型形参或普通形参的使用。而 “类模板名 :”所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符!,Database & Information System Lab,24,类模板,类模板的实例化 不能使用类模板来直接生成对象 类型参数是不确定的 必须先为模板参数指定“实参” 即为模板“实例化” 实例化格式 类模板名 利用类模板生成对象 类模板名 对象名称,Database & Information System Lab,25,类模板,【例如】对具有一个类型参数T的类模板TestClass,在类体外定义其成员函数getData时的大致样式如下: template T TestClass :getData( 形参表 ) . /函数体 ; 其中的“TestClass:”所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符!,Database & Information System Lab,26,类模板,【例9.4】仅使用类型参数的类模板示例 #include template class TestClass public: T buffer10; /T类型的数据成员buffer数组大小固定为10 T getData(int j); /获取T类型buffer(数组)的第j个分量 ; template T TestClass:getData(int j) return *(buffer+j); ;,Database & Information System Lab,27,类模板,void main() TestClass ClassInstA; /char取代T,从而实例化为一个具体的类 char cArr6=“abcde“; for(int i=0; i5; i+) ClassInstA.bufferi=cArri; for(i=0; i5; i+) char res=ClassInstA.getData(i); coutres“ “; coutendl;,Database & Information System Lab,28,类模板,TestClass ClassInstF; /实例化为另外一个具体的类 double fArr6=12.1, 23.2, 34.3, 45.4, 56.5, 67.6; for(i=0; i6; i+) ClassInstF.bufferi=fArri-10; for(i=0; i6; i+) double res=ClassInstF.getData(i); coutres“ “; coutendl; 程序执行后的显示结果如下: a b c d e 2.1 13.2 24.3 35.4 46.5 57.6,Database & Information
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号