c++第六章 模板

上传人:野鹰 文档编号:1088314 上传时间:2017-05-27 格式:PPT 页数:30 大小:278KB
返回 下载 相关 举报
c++第六章 模板_第1页
第1页 / 共30页
c++第六章 模板_第2页
第2页 / 共30页
c++第六章 模板_第3页
第3页 / 共30页
c++第六章 模板_第4页
第4页 / 共30页
c++第六章 模板_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《c++第六章 模板》由会员分享,可在线阅读,更多相关《c++第六章 模板(30页珍藏版)》请在金锄头文库上搜索。

1、1,第六章 模 板,6.1 模板的概念6.2 函数模板与模板函数6.3 类模板和模板类,2,模板是面向对象多态性的一种表现,1990年ANSI C+委员会将模板确定为组成部分,Borland C+ 3.0以上和Visual C+都支持模板。模板包括函数模板和类模板。一、为什么要引入模板? 模板的引入一个最重要的目的就是简化编程。由于C+是强类型语言,许多类似功能(函数或类)只要数据类型不同,就必须定义多份,不但使源程序增长,工作量也加大。,3,例如,设计一个求两参数最大值的函数,不使用模板时,需要定义四个函数:int max(int a,int b)return(ab)?a:b;float m

2、ax(float a,float b)return(ab)?a:b;double max(double a,double b)return(ab)?a:b;char max(char a,char b)return(ab)?a:b;这些函数的功能甚至语句都类似,能否只写一套代码,使用与多种数据类型呢?,6.1 模板的概念,4,6.1 模板的概念,解决的答案就是模板,通过类型参数化来实现代码重用即把数据类型定义为参数,使用时才给出具体类型来实例化类型参数。模板分为 函数模板(function template)和类模板(class template)。,5,模板,模板函数,模板类,对象,实例化,

3、实例化,图6.1 模板、模板类、模板函数和对象之间的关系,实例化,6.1 模板的概念,6,所谓函数模板,就是写一个函数模子,用这个模子套印出许多功能相同,参数类型和返回类型不同的函数。 模板函数:函数模板实例化后的具体函数。,6.2 函数模板与模板函数,7,6.2.1 函数模板的声明与模板函数的生成函数模板的声明格式如下:template 返回类型 函数名(模板形参表) 函数体type是模板形参,在使用函数模板时,必须将其实例化,即用实际的数据类型替代它。,6.2 函数模板与模板函数,8,函数max()若使用模板,则只定义一个函数:template type max(type a,type b

4、)return(ab)?a:b; 函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码。该定义只是对函数的描述,表示它每次能单独处理在类型形式参数表中说明的数据类型。,6.2 函数模板与模板函数,9,/例6.1 #include template 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.546; char c1=k,c2=n;,6.2 函数模板与模板函数,10,cout“the max of i1,i2=“max(i1

5、,i2)endl;cout“the max of f1,f2=“max(f1,f2)endl;cout“the max of d1,d2=“max(d1,d2)endl;cout“the max of c1,c2=“max(c1,c2)y)?x:y;,float max(float x,float y)return(xy)?x:y;,double max(double x,double y)return(xy)?x:y;,char max(char x,char y)return(xy)?x:y;,结果:the max of i1,i2=56the max of f1,f224.5the ma

6、x of d1,d2=4656.546the max of c1,c2=n,11,函数模板max(T x,T y),模板函数1max(i1,i2),模板函数2max(f1,f2),模板函数3max(d1,d2),模板函数4max(c1,c2),函数模板:一组函数的抽象模板函数:一个具体的函数代码重用,提高了程序设计的效率,12,例6.2:#include template T sum(T *array, int size=0) T total=0; for(int i=0;isize;i+) total+=arrayi; return total; ; int int_array=1,2,3,

7、.,10; double double_array=1.1,2.2,9.9,10.10; void main() int itotal=sum(int_array,10); double dtotal=sum(double_array,10); cout“The sum of int array are:”itotalendl; cout“The sum of double array are:”dtotalendl; ,结果:The sum of int array are:55The sum of double array are:59.6,13,说明:(1)在函数模板中允许用多个类型参数

8、。注意定义形式: 每个模板形参前必须加关键字class。 例:template void myfun(T1 x,T2 y) coutx ymyfun(int,char*) myfun(0.12345,10L); -myfun(double,long int)(2)在模板template 语句和函数模板定义之间不能有别的语句。,6.2 函数模板与模板函数,14,6.2.2 函数模板的异常处理,实例化T的各模板实参之间必须保持完全一致的类型,否则会发生错误。 template max(T x,T y) return (xy)?x:y; void fun(int i,char c) max(i,i)

9、; /ok max(c,c); /ok max(i,c); /error 无法匹配 max(c,i); /error,模板没有隐含的类型转换功能,15,(1)采用强制类型转换 max(i,int(c);(2)重载函数模板 template max(T x,T y) return (xy)?x:y; int max (int ,int);只声明原型 void fun(int i,char c) max(i,i); /ok call max (int ,int); max(c,c); /ok call max (char ,char); max(i,c); /ok call max (int ,i

10、nt); max(c,i); /ok call max (int ,int);,支持隐式类型转换,16,定义一个完整的非模板函数#include#includetemplateT max(T x,T y)return (xy)?x:y;char* max(char* x,char* y)return (strcmp(x,y)0?x:y);void main() coutMax(Hello,Gold)is“max(Hello,Gold)endl;结果:Max(Hello,Gold) is Hello该例中,调用的是非模板函数char* max(char*,char*),17,C+中函数调用的一般

11、顺序为:(1)寻找一个参数完全匹配的函数,若找到则调用之,否则(2)寻找一个函数模板,若找到则将其实例化为一个模板函数,然后调用之,否则(3)寻找重载函数,考察有无可通过类型转换产生参数匹配的函数,若有则调用之。,先配外部,6.2.2 函数模板的异常处理,18,类模板 (也称为类属类或类生成类)是:允许用户为类定义一种模式,使得类中的某些数据成员,某些成员函数的参数或者返回值,能取任意数据类型。 template class /类说明体 ; 模板类:类模板实例化成一个具体的类; 类名 对象名。,6.3 类模板与模板类,19,例:堆栈类模板 const int size=10; template

12、 class Stack T stksize; /堆栈元素类型可变 int top; /记录元素个数,int型不变public: Stack() top=0; /创建 void push( T ob); /元素入栈 T pop( ); /元素出栈;,20,类体外成员函数定义格式: template 返回类型 类名 :函数名(参数表) 函数体 在类体外定义成员函数时,若其中用到模板形参,则需要在函数体前进行模板声明,函数名前的类名之后也要缀上。,21,例:template void Stack:push( T ob) if(top=size) cout“Stack full”; return ;

13、 else stktop=ob; top+; ,template void Stack:pop() if(top=0) cout“Stack empty”; return ; top-; return stktop; ,22,例:堆栈类模板使用int main( ) Stack s1,s2; /Stack s1,s2; s1.push(a); s1.push(b); s1.push(c); s2.push(x); s2.push(y); s2.push(z); cout“pop s1:”; for(int i=0;i3;i+) couts1.pop(); cout“pop s2:”; for(int i=0;i3;i+) couts2.pop(); return 0;,

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

当前位置:首页 > 研究报告 > 综合/其它

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