第十三讲模板及其应用.ppt

上传人:本田雅阁 文档编号:3128306 上传时间:2019-07-14 格式:PPT 页数:40 大小:349.02KB
返回 下载 相关 举报
第十三讲模板及其应用.ppt_第1页
第1页 / 共40页
第十三讲模板及其应用.ppt_第2页
第2页 / 共40页
第十三讲模板及其应用.ppt_第3页
第3页 / 共40页
第十三讲模板及其应用.ppt_第4页
第4页 / 共40页
第十三讲模板及其应用.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《第十三讲模板及其应用.ppt》由会员分享,可在线阅读,更多相关《第十三讲模板及其应用.ppt(40页珍藏版)》请在三一文库上搜索。

1、第十三讲 模板及其应用,13.1 函数模板 13.2 类模板 13.3 类模板应用,13.1 函数模板 13.2 类模板 13.3 类模板应用,1.函数模板的概念,通常设计的算法(处理语句)是可以处理多种数据类型的,但目前处理相同的问题,仍要分别定义多个类似的函数。,13.1 函数模板 13.2 类模板 13.3 类模板应用,int max (int a, int b) /求两个整数中较大值 if(ab) return a; else return b; double max (double a, double b) /求两个浮点数中较大值 if(ab) return a; else retu

2、rn b; char max (char a, char b) . /求两个字符中较大值 ,例1.求两个数据中较大值(P.300),13.1 函数模板 13.2 类模板 13.3 类模板应用,如果“提取”出一个可变化的类型参数T,就可以“综合”成同一个函数(模板),它实际上代表着一组函数:,T max (T a, T b) if(ab) return a; else return b; ,13.1 函数模板 13.2 类模板 13.3 类模板应用,在C+中定义完整的函数模板max时,格式如下:,template T max (T a, T b) if(ab) return a; else re

3、turn b; ,13.1 函数模板 13.2 类模板 13.3 类模板应用,2.函数模板的说明,template ,template: 关键字,指明为函数模板或类模板。,模板参数表:用尖括号“”括起来,一个或多个模板参数,用逗号“,”分开。,模板参数:class。参数名是标识符,其对应实参可以是系统预定义类型或用户自定义类型。,13.1 函数模板 13.2 类模板 13.3 类模板应用,函数定义:和一般函数定义相同。 () ,13.1 函数模板 13.2 类模板 13.3 类模板应用,注意:,1) 应在“返回类型”或“形参表”或“函 数体”中使用上述的“类型形参 名” 。 2) 调用处则类似

4、于一般函数,用户 只需给出具体的实参。 3) 模板函数调用时,不进行实参到 形参类型的自动转换。,13.1 函数模板 13.2 类模板 13.3 类模板应用,例2:函数模板实例一 Program 9-1.cpp (P.302),例3:函数模板实例二 Program 9-2.cpp (P.303),例4:函数模板实例三 Program 9-3.cpp (P.303-304),13.1 函数模板 13.2 类模板 13.3 类模板应用,利用类模板(带类型参数或普通参数的类),一次就可定义出具有共性的一组类。 即,可使得所定义类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值都可以是任意类

5、型的。,13.1 函数模板 13.2 类模板 13.3 类模板应用,1.类模板定义格式,template class 类模板定义体 ,template:关键字,指明本说明为类模板说明。,模板参数表:用尖括号“”括起来的若干个类型形参或者普通形参。说明类型形参时,使用“class ”的方式。说明普通形参时,使用“”的方式。,13.1 函数模板 13.2 类模板 13.3 类模板应用,class:关键字,指明定义的是类模板。,类模板名:用户自定义标识符。,类模板定义体:实际上是类定义体,以类模板参数作为某个类或某个类型名来使用。,13.1 函数模板 13.2 类模板 13.3 类模板应用,注意:,

6、2) 利用类模板说明类对象时,要随类模板名同时给出对应于类型形参或普通形参的具体实参(从而实例化为一个具体的类)。说明格式为: 类模板名 类型形参的相应实参为类型名,而普通形参的相应实参必须为常量。,1) 类定义体中应使用上述的“类型形参名”及“普通形参名”。,13.1 函数模板 13.2 类模板 13.3 类模板应用,3) 类模板的成员函数既可以在类体内进行说明(自动按内联函数处理),也可以在类体外进行说明。 在类体外说明(定义)时使用如下格式: template 返回类型 类模板名 :函数名( 形参表 ) 函数体 ;,上述的“形参1的名字”来自于“形参1的说明”,由“甩掉”说明部分的“类型

7、”而得,是对类型形参或普通形参的使用。而 “类模板名 :”所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符!,13.1 函数模板 13.2 类模板 13.3 类模板应用,例5,对具有一个类型参数T的类模板TestClass,在类体外定义其成员函数getData时的大致样式如下: template T TestClass: getData( 形参表 ) . /函数体 ;,其中的“TestClass:”所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符!,13.1 函数模板 13.2 类模板 13.3 类模板应用,2.仅使用类型参数的类模板示例,例6: #include te

8、mplate class TestClass public: T buffer10; /T类型的数据成员buffer数组大小固定为10 (灵活性差!) T getData(int j); /获取T类型buffer(数组)的第j个分量 ; template T TestClass:getData(int j) return *(buffer+j); ;,13.1 函数模板 13.2 类模板 13.3 类模板应用,void main() TestClass ClassInstA; /char取代T,从而实例化为一个具体的类 char cArr6=“abcde“; for(int i=0; i5;

9、i+) ClassInstA.bufferi=cArri; for(i=0; i5; i+) char res=ClassInstA.getData(i); coutres“ “; coutendl;,13.1 函数模板 13.2 类模板 13.3 类模板应用,void main() 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 re

10、s=ClassInstF.getData(i); coutres“ “; coutendl; ,13.1 函数模板 13.2 类模板 13.3 类模板应用,程序执行后的显示结果如下: a b c d e 2.1 13.2 24.3 35.4 46.5 57.6,13.1 函数模板 13.2 类模板 13.3 类模板应用,3.仅使用普通参数(非类型参数)的类模板示例,例7: #include template class TestClass public: int bufferi; /使buffer的大小可变化,但其类型则固定为int(灵活性差!) int getData(int j); ; t

11、emplate int TestClass:getData(int j) return *(buffer+j); ;,13.1 函数模板 13.2 类模板 13.3 类模板应用,void main() 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; ,13.1 函数模

12、板 13.2 类模板 13.3 类模板应用,程序执行后的显示结果如下: 2 13 24 35 46 57,13.1 函数模板 13.2 类模板 13.3 类模板应用,4.同时使用类型参数和普通参数的类模板示例,例8: #include #include “string.h“ template class TestClass public: T bufferi; /T类型的buffer,其大小随普通形参i的值变化(灵活性大!) T getData(int j); ; template T TestClass:getData(int j) return *(buffer+j); ;,13.1 函数

13、模板 13.2 类模板 13.3 类模板应用,void main() TestClass ClassInstA; char cArr6=“abcde“; strcpy(ClassInstA.buffer, cArr); for(int i=0; i5; i+) char res=ClassInstA.getData(i); coutres“ “; coutendl;,13.1 函数模板 13.2 类模板 13.3 类模板应用,TestClass ClassInstF; double fArr6=12.1, 23.2, 34.3, 45.4, 56.5, 67.6; for(i=0; i6; i

14、+) 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,13.1 函数模板 13.2 类模板 13.3 类模板应用,1.设计一个链表类模板,定义一个处理链表的类模板list,它含有一个类型形参T,以指出每一链表项的data数据域的类型。,例9: Program9-8.cpp (P.318),#include #include templ

15、ate class list struct node T data; node * next; *head, *tail;,13.1 函数模板 13.2 类模板 13.3 类模板应用,/* 数据成员head与tail均为指针。其中的head总指向链表的首项,而tail总指向链表的尾项。每当准备往链表中加入一个表项(及其表项data数据)时,程序中首先使用“new node”来动态生成一个新的表项空间,并“填入”该表项的data数据,而后通过指针的改变与关联,将该表项加入到以head为首以tail为尾的当前链表结构中(以形成一个更新后的链表)。 */,13.1 函数模板 13.2 类模板 13.

16、3 类模板应用,public: list() /构造函数,创建一个“空链表” head=tail=NULL; ; void Insert (T * item) /*动态生成链表项空间,并将item所指向的T型数据放至该项的data;而后将新生成的该链表项插入到原链的链首(链表的“栈”式用法)。*/ . ;,13.1 函数模板 13.2 类模板 13.3 类模板应用,void Append (T * item) /*动态生成链表项空间,并将item所指向的T型数据放入该项的data; 而后将新生成的该项附加到原链的链尾(链表的“队列”式用法)。 */ . ; T get () /*取出链表首项的

17、数据(data域值),并将该首项从链表中删去 */ . ; ; /类模板list定义结束,13.1 函数模板 13.2 类模板 13.3 类模板应用,class person public: char name20; int age; float hight; ; /* 注:若说明为“char* name;”,则主函数处要通过new为每一对象的name域申请动态空间! */ void main() person ps; list link1; list link2;,13.1 函数模板 13.2 类模板 13.3 类模板应用,cout 0 - 1 - 2 - 3 - 4 link2链表: he

18、ad - 4号人员信息 - 3号人员信息 - 2号人员信息 - 1号人员信息 - 0号人员信息 */,13.1 函数模板 13.2 类模板 13.3 类模板应用,cout“ - The result -“endl; for (i=0;i5;i+) ps=link2.get(); /取出link2链表首项的人员信息 link2.Append( /输出link2链表人员信息的name, /以及link1链表表项中的对象的顺序号 ,13.1 函数模板 13.2 类模板 13.3 类模板应用,cout“ - The result -“endl; for (i=0;i5;i+) ps=link2.get

19、(); /取出link2链表首项的人员信息 link2.Append( /*输出link2链表人员信息的name以及link1链表表项中的对象的顺序号 ,13.1 函数模板 13.2 类模板 13.3 类模板应用,程序执行后的显示结果如下: - Input 5 persons information - input 0 inf(name,age,hight):zhangLi 20 1.68 input 1 inf(name,age,hight):wangyue 21 1.72 input 2 inf(name,age,hight):liming 19 1.75 input 3 inf(name

20、,age,hight):zhaoyi 19 1.78 input 4 inf(name,age,hight):chenjin 20 1.8 - The result - chenjin 0 zhaoyi 1 liming 2 wangyue 3 zhangLi 4,13.1 函数模板 13.2 类模板 13.3 类模板应用,2.按不同方法派生出的类模板(P.314),可使用不同方法来派生类模板。例如常用如下几种方式:,(1) 一般类(其中不使用类型参数的类)作基类。,(2) 类模板作基类(但仅基类中用到类型参数T)。,(3)类模板作基类(但基类与派生类中均用到同一个类型参数T),(4) 类模板

21、作基类(基类中用到类型参数T2,派生类中用到类型参数T1),13.1 函数模板 13.2 类模板 13.3 类模板应用,class CB . ; template class CA:public CB T t; public: . ;,例10:一般类做基类的实例,13.1 函数模板 13.2 类模板 13.3 类模板应用,例11:类模板作基类的实例,template class CB T t; public: T gett() return t; . ; template class CA:public CB /*CA为类模板,其基类CB也为类模板。注意,类型参数T将被“传递”给基类CB,本派

22、生类中并不使用该类型参数T */ double t1; public: .;,13.1 函数模板 13.2 类模板 13.3 类模板应用,例12:类模板做基类的实例,template class CB T t; public: T gett() return t; . ; template class CA:public CB /*类型参数T将被“传递”给基类CB,且本派生类中也使用T */ T t1; public: . ;,13.1 函数模板 13.2 类模板 13.3 类模板应用,例13:类模板做基类(类中用到类型参数T2,派生类中用到类型参数T1)的实例,template class CB T2 t2; public: .; template class CA:public CB /* 类型参数T2被“传递”给基类CB,本派生类中使用T1 */ T1 t1; public: . ;,作 业,思考题: 4,6 (书面) 练习题:1, 2 (上机),

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1