《数学科学学院《面向对象程序设计》09-模板.ppt》由会员分享,可在线阅读,更多相关《数学科学学院《面向对象程序设计》09-模板.ppt(33页珍藏版)》请在三一办公上搜索。
1、面向对象程序设计,模板,第09章 本讲内容,模板的基本概念函数模板类模板,模板的基本概念,所谓模板,就是将某段程序中的数据类型参数化,使得它能够处理某个范围内的数据类型而不必为每种可能的类型都建立一个实例,从而避免了重复劳动,增强了程序的灵活性和有效性。C+程序由函数和类组成,模板也分为函数模板和类模板。,函数模板(function template),函数的功能相同,但处理的数据类型不同,可以使用C+提供的函数模板避免函数代码的重复编写。,具体做法:建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。,函数模板(function template),例,int abs(
2、int x)return x0?-x:x;,double abs(double x)return x0?-x:x;,templateT abs(T x)return x0?-x:x;,int main()int n=-5;double d=-5.5;cout abs(n)endl;cout abs(d)endl;,调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。,函数模板的定义形式,template类型名 函数名(参数表)函数体的定义,template类型名 函数名(参数表)函数体的定义,或,模板函数以关键字template开头,T为类型参数,可以用来指定函数模板
3、的形参类型、返回值类型和模板函数局部变量的类型。,什么是函数模板?,template 类型名 函数名(参数表)/*函数体*/,int add(int x,int y)return(x+y);,template T add(T x,T y)return(x+y);,函数模版,试一试,C+中的模板提供了重用源代码的方法。例如,设计一个求两参数最大值的函数,不使用模板时,需要定义四个函数:int max(int a,int b)return(a b)?a,b;long max(long a,long b)return(a b)?a,b;double max(double a,double b)ret
4、urn(a b)?a,b;char max(char a,char b)return(a b)?a,b;,如果使用模板,则只需要定义一个函数:TemplateT max(T a,T b)return(a b)?a,b;,函数模板例1,#include Using namespace std;template T max(T a,T b)return a b?a:b;void main()cout max(20,30)=max(20,30)endl;cout max(t,v)=max(t,v)endl;cout max(10.1,15.2)=max(10.1,15.2)endl;,类型参数可以不
5、只一个,可以根据需要确定个数。如,tempalte,函数模板只适用于函数的参数个数相同而类型不同,且函数体相同的情况。,【说明】,函数模板例2,#include using namesapce std;template T min(T a,int n)int i;T minv=a0;for(i=1;i ai)minv=ai;return minv;,void main()int a=1,3,0,2,7,6,4,5,2;double b=1.2,-3.4,6.8,9,8;cout“a数组的最小值为:”min(a,9)endl;cout“b数组的最小值为:”min(b,4)endl;,函数模板的重
6、载,#include using namesapce std;template T min(T x,T y)cout y?y:x;,template T min(T*a,int n)int i;T minv=a0;for(i=1;i ai)minv=ai;cout“调用min(T a,int n),最小值为”;return minv;,void main()int x=8,y=23;double a5=2.342,11.346,8.93,18.111,5.930;cout min(x,y)endl;cout min(a,5)endl;,类模板,类模板是类的抽象,类是类模板的实例。类成员声明的方
7、法与普通类的定义几乎相同,只是在它的各个成员(数据成员和函数成员)中通常要用到模板的数据类型参数T。,例,class Pair_intpublic:Pair_int(int a,int b)x=a;y=b;int max()return(xy)?x:y;int min()return(xy)?x:y;private:int x,y;,class Pair_floatpublic:Pair_float(float a,float b)x=a;y=b;float max()return(xy)?x:y;float min()return(xy)?x:y;private:float x,y;,cla
8、ss Pairpublic:Pair(T a,T b)x=a;y=b;T max()return(xy)?x:y;T min()return(xy)?x:y;private:T x,y;,声明类模板,减少重复的工作,template,定义对象的方法,Pair p1(4,7);Pair p2(1.5,6.7);Pair p3(-2.5,9.67);,类模板的成员函数在类外定义,应当写成类模板的形式。如:,template T Pair:max()return(xy)?x:y;,templateclass 类名类成员声明;,模板 对象名1,对象名n,template 类型名 类名:函数名(参数表)
9、,类模板实例化,类,对象,类实例化,类模板类型参数可以有一个或多个,每个类型前面都必须加typename(或class)。如,tempalte class someclass;someclass obj;,函数模板、类模板的定义和实现必须写在一起。因为模板在例化时,需要知道类模板和函数模板的完整定义。,【说明】,类模板例1,#include#include using namespace std;template class Array public:Array(T a,T b)x=a;y=b;T sum()T tempsum=x+y;return tempsum;private:T x,y;
10、,void main()Array A(7.0,6.0);cout B(1.0,6.0);cout“B元素和为 B.sum()endl;,扩充:类模板的派生,templateclass base/;templateclass derive:public base/;与一般的类派生定义相似,只是指出它的基类时要加上模板参数,如base,22,例9-2 类模板应用举例,#include#include using namespace std;/结构体Studentstruct Student int id;/学号 float gpa;/平均分;,template class Store priva
11、te:T item;/用于存放任意类型的数据bool haveValue;/标记item是否已被存入内容public:Store();T/以下实现各成员函数。template Store:Store():haveValue(false),23,/提取数据函数的实现template T/将x值存入item,24,int main()Store s1,s2;s1.putElem(3);s2.putElem(-7);cout s3;s3.putElem(g);cout d;cout Retrieving object D.;cout d.getElem()endl/由于d未经初始化,执行函数D.ge
12、tElement()时导致程序终止return 0;,25,例2:#includetemplate T max(T x,int n)/或者是T*x int i;T maxv=x0;for(i=1;in;i+)if(maxvxi)maxv=xi;return maxv;void main()int a=4,5,2,8,9,3;double b=3.5,6.7,2,5.2,9.2;couta数组最大值:max(a,6)endl;coutb数组最大值:max(b,5)endl;,本程序的执行结果如下:a 数组最大值:9b 数组最大值:9.2,第九章 习题,1、使用函数模板实现对不同类型数组求平均值的
13、功能,并在main()函数中分别求一个整型数组和一个单精度浮点型数组的平均值。,#includeusing namespace std;template float average(T1,扩充:标准模版库(STL)简介,(1)是C+语言提供的一套预先写好的函数模版和类模版(2)STL是Standard Template Library的缩写(3)是C+标准库的一个子集,1、标准模版库(STL)是什么?,absfindlistvector,2、标准模版库(STL)常见的模版有哪些?,扩充:标准模版库(STL)简介,本章习题,1、模板参数表中参数使用的符号分隔是_。A),B);C)/D)以上都不是2、以上对模板的声明,正确的是_。A)template B)template C)template D)template 3、有类模板定义如下:template class Dream;4、下列类对象定义中,正确的是_。A)Dream a;B)Dream a;C)Dream a;D)Dream a;,本章习题,4、填写下面的空格,将程序代码补充完整。template _min(T x,T y)cout调用min(T x,T y),最小值为;return _,Thank You!,