第八章函数模板与类模板ppt课件.ppt

上传人:牧羊曲112 文档编号:1356943 上传时间:2022-11-13 格式:PPT 页数:35 大小:113.50KB
返回 下载 相关 举报
第八章函数模板与类模板ppt课件.ppt_第1页
第1页 / 共35页
第八章函数模板与类模板ppt课件.ppt_第2页
第2页 / 共35页
第八章函数模板与类模板ppt课件.ppt_第3页
第3页 / 共35页
第八章函数模板与类模板ppt课件.ppt_第4页
第4页 / 共35页
第八章函数模板与类模板ppt课件.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《第八章函数模板与类模板ppt课件.ppt》由会员分享,可在线阅读,更多相关《第八章函数模板与类模板ppt课件.ppt(35页珍藏版)》请在三一办公上搜索。

1、第8章 模 板,8.1 模板的概念,问题的引入:一些函数的功能相同,唯一的区别只在于处理对象的数据类型不同,若用函数重载实现,则需编写多个函数:例: int max(int i, int j) return ij?i:j; float max(float i, float j) return ij?i:j; char max(char i,char j) return ij?i:j;,这些函数执行的功能是相同的,只是参数类型和函数返回类型不同,能否为上述这些函数只写出一套代码呢?,T max(T x,T y) return (xy)?x:y;,模板运算对象的类型不是实际的数据类型,而是一种参数

2、化的类型,即是把数据类型作为模板的参数。 模板是实现代码重用机制的一种工具。,8.2 函数模板与模板函数,函数模版:建立一个通用函数,其函数返回类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模版。,8.1 函数模板的声明,函数模板的一般说明形式如下: template 返回类型 函数名(模板形参表) 函数体 ,每个类型参数之前都有一个关键字class或typename。多个类型参数之间用逗号分隔。作用:说明其后的参数是一个虚拟的类型名,例如,将求最大值函数max()定义成函数模板,如下所示: template T max(T x, T y) return (x y)

3、? x : y; 也可以定义成如下形式: template T max(T x,T y) return (xy)?x:y; 其中,T为类型参数,它既可取系统预定义的数据类型,又可以取用户自定义的类型。,函数模板参数表的类型参数可以用于函数返回值,也可用于函数参数表及函数体中。,说明: (1) 函数模板本身不是函数,是生成函数的“模板”。经实例化后才得到真正的函数。 (2)实例化是指用某一具体的实际数据类型替代模板中的类型参数的过程。,8.2.2 函数模板的使用,函数模板的使用就是将函数模板的实例化为具体的函数。函数模板的实例化由编译器来完成。编译系统根据函数调用的实际参数类型自动完成函数模板的

4、实例化。 当编译系统发现有一个函数调用: 函数名(模板实参表); 时,将根据模板实参表中的类型生成一个函数即模板函数。该模板函数的函数体与函数模板的函数定义体相同。,【例8.1】 函数模板的使用。#include template T max(T x,T y) return (xy) ? x:y; main() int i1= 10, i2=56; float f1=12.5, f2=24.5; double d1=50.344, d2=4656.346; char c1=k ,c2=n; coutThe max of i1,i2 is: max(i1,i2)endl; coutThe max

5、 of f1,f2 is: max(f1,f2)endl; coutThe max of d1,d2 is: max(d1,d2)endl; coutThe max of c1,c2 is: max(c1,c2)endl; return 0;,总结:函数模板提供了一类函数的抽象,代表了一类函数。模板函数表示一具体的函数。,函数模版max(T,T),模版函数max(int,int),模版函数max(double,double),模版函数max(char,char),实例化,实例化,实例化,#include template AT sum(AT *array,int size=0)AT total

6、=0;for(int i=0;isize;i+)total+=arrayi;return total;,例:有关指针的函数模板举例。,int int_array=1,2,3,4,5,6;double d_array=1.1,2.2,3.3,4.4,5.5;main()int itotal=sum(int_array,6);double dtotal=sum(d_array,5);coutitotal= itotalendl;coutdtotal= dtotalendl;,1)在template语句与函数模板定义之间不许有别的语句。 template int i; /错误 T min(T x,T

7、 y) return (xy)?x:y;,函数模板定义时应注意的问题:,2)调用模板函数时,应保证函数的实参类型与类型参数完全匹配。函数模板在实例化过程中不做任何类型转换。例如:已知函数模板max的两个形参都是类型参数TYPE类型的,则以下两个应用错误: max(10, 10.5); /一个实参是整型,另一个是double型,类型不同 max(10, obj1); /一个实参是整型,另一个是MY_CLASS类型,都无法实例化3)在函数模板中允许使用多个类型参数。在template定义部分的每个类型参数前必须有关键字class(或typename)。,#include template void

8、 myfunc(type1 x,type2 y) coutx yendl; int main() myfunc(10,hao); myfunc(0.123,10); return 0; ,例:有两个类型参数的函数模板。,4)函数模板也可以重载。 例:函数模板重载。template Type min(Type x,Type y) return (xType min(Type x,Type y,Type z) Type t; t=(xy)?x:y; return (tz)?t:z;,5)函数模板与同名的非模板函数也可以重载。调用顺序: 1)参数完全匹配的非模板函数; 2)函数模板,将其实例化,产生

9、模板函数; 如果以上2种情况都未找到匹配函数,则按出错处理。,#includetemplate AT min(AT x,AT y)cout调用模板函数;return (xy)?x:y;int min(int x,int y)cout调用非模板函数;return (xy)?x:y;,int main()int i1=10,i2=56;double dl=50.34,d2=23,56;char c1=k,c2=c;cout较小的整数是:min(i1,i2)endl;cout较小的双精度型数是:min(d1,d2)endl;cout较小的字符串是:min(c1,c2)endl; return 0;,

10、6)在函数模板定义template中给出的每一个形式类属参数都必须在函数形参表中至少出现一次:如: template void fun(T1 x, T2 y) 错误的用法 template TYPE* func() template void func() TYPE obj; ,8.3 类模板与模板类,类模板:建立一个通用类,其数据成员,成员函数的返回类型和形参类型不具体指定,用一个虚拟的类型来代表。 使用类模版定义对象时,系统会根据实参的类型来取代类模版中虚拟类型,从而实现不同类的功能。,定义一个类模板,其格式如下: template class 类名 / 类模板定义体 ;,例:定义类模板C

11、Three储存三个成员变量,返回这三个成员变量的和。,template class CThreepublic: CThree(T t1,T t2,T t3):a(t1),b(t2),c(t3) T sum() return a+b+c;private:T a,b,c;,说明:(1)定义模板时应至少确定一个模板参数;(2)类模板的定义格式与类的定义格式相同,包含说明部分和实现部分;在类体外定义时,其格式如下: template 返回值类型 类名:函数名(参数表) 函数体,template class CThreepublic: CThree(T t1,T t2,T t3); T sum();pr

12、ivate:T a,b,c;template CThree:CThree(T t1,T t2,T t3) a=t1;b=t2;c=t3;template T CThree:sum() return a+b+c;,类模板不是代表一个具体的、实际的类,而是代表着一类类。实际上,类模板的使用就是将类模板实例化成一个具体的类,即为模板类。它的格式为: 类模板名 对象名; 类模板名 对象名(参数);,int main() CThree a(3,5,1); CThree b(3.3,5.1,1.2); cout“三个整数的和是”a.sum()endl; cout“三个实数的和”b.sum()endl; r

13、eturn 0;,类模板CThree,例: 栈类模板的使用。#includeconst int size=10;template /声明一个类模板class stack public: void init() tos=0; void push(Type ch); /参数取Type类型 Type pop(); /返回类型取Type类型 private: Type stcksize; /数组的类型为类型参数Type, int tos; ;,template /每个成员函数都要加上模板声明void stack:push(Type ob) /类名为stack if (tos=size) coutTyp

14、e stack :pop() if (tos=0) coutstack is empty; return 0; tos-; return stcktos;,int main() /定义字符堆栈 stack s1,s2; /创建两个模板参数为char型的对象 int i; s1.init(); s2.init(); s1.push(a); s2.push(x); s1.push(b); s2.push(y); s1.push(c); s2.push(z); for(i=0;i3;i+) coutpop s1: s1.pop()endl; for(i=0;i3;i+) coutpop s2: s2

15、.pop()endl;,/定义整型堆栈 stack is1,is2; /创建两个模板参数为int型的对象is1.init(); is2.init();is1.push(1); is2.push(2);is1.push(3); is2.push(4);is1.push(5); is2.push(6); for (i=0;i3;i+) coutpop is1: is1.pop()endl;for (i=0;i3;i+) coutpop is2: is2.pop()endl;return 0; ,例:使用两个类型参数的类模板。#include template class myclasspublic: myclass(T1 a,T2 b) i=a; j=b; void show()couti= i j= jendl;private:T1 i;T2 j;,模板类也可以有多个类型参数。,int main()myclass ob1(12,0.15);myclass ob2(x,This is a test);ob1.show();ob2.show();return 0;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号