模板的概念是仅在c++语言的高版本中才引进的模板(temp...

上传人:j****9 文档编号:54884743 上传时间:2018-09-21 格式:PPT 页数:11 大小:42KB
返回 下载 相关 举报
模板的概念是仅在c++语言的高版本中才引进的模板(temp..._第1页
第1页 / 共11页
模板的概念是仅在c++语言的高版本中才引进的模板(temp..._第2页
第2页 / 共11页
模板的概念是仅在c++语言的高版本中才引进的模板(temp..._第3页
第3页 / 共11页
模板的概念是仅在c++语言的高版本中才引进的模板(temp..._第4页
第4页 / 共11页
模板的概念是仅在c++语言的高版本中才引进的模板(temp..._第5页
第5页 / 共11页
点击查看更多>>
资源描述

《模板的概念是仅在c++语言的高版本中才引进的模板(temp...》由会员分享,可在线阅读,更多相关《模板的概念是仅在c++语言的高版本中才引进的模板(temp...(11页珍藏版)》请在金锄头文库上搜索。

1、第三章 模 板 模板的概念是仅在C+语言的高版本中才引进的。模板(template)是一 种参数化的类型,在有模板概念之前,C+语言的程序员热衷于涉及“类属类” (Genericdass),其目标是为了实现程序代码的可重用性,通过“类属编程”使得同一结构的不同实例共用同样的代码,这样的类属数据结构包括:栈,队列,数组,矩阵,链表,二叉树,散列表和图等等。这项工作的意义是明显的,这样的类库应用很广,可以节省代码,易于维护;当然,类属类的编程也十分繁琐。 C+(高版本)的模板支持类屑编程,大大简化了类屑数据结构的编程工作。熟练地使用模扳概念,是高级的c+程序员的必要条件之一。 类模板是一种带参类,

2、或说是具有共性的一组类。模板增加了以类为特征的程序模块的通用性。例如,集合、矩阵,链表都可以设计成类。但是如果采用模板的形式,则编程的效率更高。例如,集合类,根据集合类元素的不同类型,如int型,char型,float型,pomt型,complex型等等,可以是系统类型,也可以是用户定义类型。总之对于每一种元素类型,可以定义一个集合类。利用模板的形式,以类型为参数,可以定义一个,集合(set)模板,每指定一种类型作为“实参”,这个模板就成为一个特定的集合类。函数模板也有类似的特征。模板说明C+支持两类的模板,它们分别是类模板与函数模板。下面就分别对这两类模板进行讨论。 3. 1 类模板说明类模

3、板的说明就是一个带有类型参数的类定义,其格式为;templateclass,说明:template:关键字,指明本说明为类模板说明或函数模板说明。摸板参数表;用尖括号括起来,其量简单的形式是,T为类参数名。class:关键字class指出定义的是类模板类模板名;标识符。类模板定义体:它实际上是一个类的定义,在定义中,以类参数T(标识符)作为某一类或类型名。例如:,templateclass SetT elemsmaxcard;int card;public:Set( )cardO; 其他成员函数说明;下面是与类模板有关的几个问题:(1)类模板的实例化。类模板不能直接生成对象,因为其类型参数是不

4、确定的,故须首先对模板参数指定“实参”,实例化的形式为;例如:SetSetSet这实际上给出了三个具体的集合类。Setsl,s2;,即是说明了两个整型集合的对象sl,s2。由此可以看出,每个类模板的实例就是一个具体的类,由类模板 的实例可以说明或创建该类的对象。也可以用由用户定义的类来进行实例化例如,我们已经定义了类complex,类point,于是可以用complex和point作为“实参”来对于类模板Set进行实例化:Set(complex)Set(point)这两个集合类的元素是复数类complex的对象,点类point的对象。(2)类模板定义中的函数成员可以是内联的(在类内定义),也可

5、以在类外定义,其书写格式为:template(class Tint set:memberfor(int i=0;icard;i+)if(elemsielem)return l;return 0;;,(3)类模板也可以继承。可分为下面几种情况说明:一般类作基类,派生出类模板。例如:class CBint i;char c;public:CB()i=lO:c=a;;int geni()class CA:public CBT t;public:void putt(T tt)ttt;于是可创建对象:CAbai;,CAbac;对于对象bai,bac下面的语句是合法的:coutclass CBpublic

6、:void fb(T t)coutt;其中:template:关键字指明为函数模板或类模板。模板参数表:用尖括号括起来,一个或多个模板参数,用“ ”分开。模板参数:其格式为class,可以是系统定义的类型名如lilt,char,也可以是用户定义的类型名。函数定义:与一般函数定义一样:();,应注意的是,在模板参数表中的类型参数应出现在函数参数表中作为参数的类型。例如:templateT max(T a,T b)return ab? a:b;如此,我们定义了一个简单的函数模板,当我们为类型参数T指定为某一具体的类型时,函数模板max()就是一个具体求较大元的max函数了当然,类型参数T的“实参”

7、,应该是一个可以进行关于运算符“”运算的系统定义的类型(如int,float,char等),或已重载了运算符“”的用户定义类型。关于函数模板的使用有下面一些说明;(1)函数模板可以直接使用,而不需要像类模板那样必须首先实例化。例如,上面定义的函数模板可以直接使用:int m,n;char cl,c2;cout(maxm+n,m-n)“ “max(cl,c2)b? a:b;);char max(char chl,char ch2)return ch1ch2? chl:ch2;(2)函数模板在被调用时与同名的函数调用没有什么区别,那么系统是如何处理的呢?例如编译器扫描到函数调用表达式max(cl,

8、c2)时:首先搜索程序说明中是否有参数表恰为max(el,c2)的同名函数,如果有,就调用此函数代码付诸执行。否则执行下一步。检查是否有函数模板,经适当实例化成为参数匹配的同名函数。如果有,调用此实例化的模板函数代码付诸执行。否则执行下一步。检查是否有同名函数,可经参数的自动转换后实现参数匹配。如果有,调用该函数代码付诸执行。如果三种情况都未找到匹配函数,则按出错处理。值得注意的是,模板函数调用时,与一般函数不同之处在于,它不允许类型的转换。也就是说,调用函数的实参表在类型上必须与某一实例化了的模板函数的函数形参表完全匹配。例如,上例中调,用函数max(m,c1)将无法调用模板函数代码。相反,对于一般的函数定义:int max(int a,int b);以字符型变量c1为实参max(m,c1)调用可行。它是把字符型变量c1变换为int型后参加函数调用的。(3)模板函数也可以重载。同样,重载的条件是二同名棋板函数必须有不同的参数表。例如;templateT max(Ta,T b)return ab?a:b;templateT max(T a,T b,T c)if(ab)return max(a,c);else return max(b,c);由此例看,模板函数使用起来还是很方便的一般地说,模板类中的函数成员都是模板函数,只是其参数表中不一定包含模板的类型参数。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号