欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

    • 资源ID:4722847       资源大小:349.02KB        全文页数:40页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    第十三讲 模板及其应用,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 return 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 return 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)调用处则类似于一般函数,用户 只需给出具体的实参。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 类模板应用,利用类模板(带类型参数或普通参数的类),一次就可定义出具有共性的一组类。即,可使得所定义类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值都可以是任意类型的。,13.1 函数模板13.2 类模板13.3 类模板应用,1.类模板定义格式,template class 类模板定义体,template:关键字,指明本说明为类模板说明。,模板参数表:用尖括号“”括起来的若干个类型形参或者普通形参。说明类型形参时,使用“class”的方式。说明普通形参时,使用“”的方式。,13.1 函数模板13.2 类模板13.3 类模板应用,class:关键字,指明定义的是类模板。,类模板名:用户自定义标识符。,类模板定义体:实际上是类定义体,以类模板参数作为某个类或某个类型名来使用。,13.1 函数模板13.2 类模板13.3 类模板应用,注意:,2)利用类模板说明类对象时,要随类模板名同时给出对应于类型形参或普通形参的具体实参(从而实例化为一个具体的类)。说明格式为:类模板名 类型形参的相应实参为类型名,而普通形参的相应实参必须为常量。,1)类定义体中应使用上述的“类型形参名”及“普通形参名”。,13.1 函数模板13.2 类模板13.3 类模板应用,3)类模板的成员函数既可以在类体内进行说明(自动按内联函数处理),也可以在类体外进行说明。在类体外说明(定义)时使用如下格式:template 返回类型 类模板名:函数名(形参表)函数体;,上述的“形参1的名字”来自于“形参1的说明”,由“甩掉”说明部分的“类型”而得,是对类型形参或普通形参的使用。而“类模板名:”所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符!,13.1 函数模板13.2 类模板13.3 类模板应用,例5,对具有一个类型参数T的类模板TestClass,在类体外定义其成员函数getData时的大致样式如下:template T TestClass:getData(形参表)./函数体;,其中的“TestClass:”所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符!,13.1 函数模板13.2 类模板13.3 类模板应用,2.仅使用类型参数的类模板示例,例6:#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);,13.1 函数模板13.2 类模板13.3 类模板应用,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;,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 函数模板13.2 类模板13.3 类模板应用,程序执行后的显示结果如下:a b c d e2.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);template 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 函数模板13.2 类模板13.3 类模板应用,程序执行后的显示结果如下:2 13 24 35 46 57,13.1 函数模板13.2 类模板13.3 类模板应用,4.同时使用类型参数和普通参数的类模板示例,例8:#include#include string.htemplate class TestClass public:T bufferi;/T类型的buffer,其大小随普通形参i的值变化(灵活性大!)T getData(int j);template T TestClass:getData(int j)return*(buffer+j);,13.1 函数模板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+)ClassInstF.bufferi=fArri-10;for(i=0;i6;i+)double res=ClassInstF.getData(i);coutres;coutendl;,程序执行后的显示结果如下:a b c d e2.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 template 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.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()/*取出链表首项的数据(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链表:head-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();/取出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.68input 1 inf(name,age,hight):wangyue 21 1.72input 2 inf(name,age,hight):liming 19 1.75input 3 inf(name,age,hight):zhaoyi 19 1.78input 4 inf(name,age,hight):chenjin 20 1.8-The result-chenjin 0zhaoyi 1liming 2wangyue 3zhangLi 4,13.1 函数模板13.2 类模板13.3 类模板应用,2.按不同方法派生出的类模板(P.314),可使用不同方法来派生类模板。例如常用如下几种方式:,(1)一般类(其中不使用类型参数的类)作基类。,(2)类模板作基类(但仅基类中用到类型参数T)。,(3)类模板作基类(但基类与派生类中均用到同一个类型参数T),(4)类模板作基类(基类中用到类型参数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,本派生类中并不使用该类型参数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(上机),

    注意事项

    本文(第十三讲模板及其应用.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开