C++程序设计 第12章 模板

上传人:zw****58 文档编号:56833408 上传时间:2018-10-16 格式:PPT 页数:26 大小:153KB
返回 下载 相关 举报
C++程序设计  第12章 模板_第1页
第1页 / 共26页
C++程序设计  第12章 模板_第2页
第2页 / 共26页
C++程序设计  第12章 模板_第3页
第3页 / 共26页
C++程序设计  第12章 模板_第4页
第4页 / 共26页
C++程序设计  第12章 模板_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《C++程序设计 第12章 模板》由会员分享,可在线阅读,更多相关《C++程序设计 第12章 模板(26页珍藏版)》请在金锄头文库上搜索。

1、第12章 模板,本讲内容提要,函数模板 函数模板 模板函数 模板实参的省略 类模板 类模板的概念与定义 模板类 类模板的继承与派生,请看下面的函数:,void add(int a,int b,int size)for(int i=0;isize;i+) bi+=ai; ,void add(float a,float b,float size)for(int i=0;isize;i+) bi+=ai; void add(double a,float b,double size)for(int i=0;isize;i+) bi+=ai; ,如果不限定数组的类型为整型,则,一、函数模板,函数模板是通

2、过对参数类型进行参数化后,获取有相同形式的函数体。 它是一个通用函数,它可适应一定范围内的不同类型对象的操作。 函数模板将代表着不同类型的一组函数,它们都使用相同的代码,这样可以实现代码重用,避免重复劳动,又可增强程序的安全性。,1.函数模板,利用函数模板解决上述问题。,函数模板的定义格式: template () 参数化类型名表又称模板参数表,多个表项用逗号分隔。 每个表项称为一个模板参数(模板形参)。格式如下: class 或typename 或 ,add模板可以定义为:,其中,“”括起部分就是模板的形参表,T是一个虚拟类型参数。注意,可以用多个虚拟参数构成模板形参表。 不但普通函数可以声

3、明为函数模板,类的成员函数也可以声明为函数模板。,template void add(T a,T b,int size)for(int i=0;isize;i+) bi+=ai; ,2.模板函数,函数模板是模板函数的一个样板,它可以生成多个重载的模板函数,这些模板函数重用函数体代码。 模板函数是函数模板的一个实例。 函数模板的实例化(instantiation),long float x=1,2,3,4,5,6,y=7,8,9,10,11,12; add(x,y,6);,void add(float a,float b,float size) for(int i=0;isize;i+) bi+

4、=ai; ,template void add(T1 a,T2 b,int size)for(int i=0;isize;i+) bi+=ai; ,例12.1:,问题:分析程序输出结果。,template void bubble(stype *item, int count) stype bubb;for(int i=0;iitemj)bubb=itemi;itemi=itemj;itemj=bubb; ,#include #include template void bubble(stype *item, int count); void main() int nums1=4,7,2,9,3

5、,7,6,1; bubble(nums1,8);cout“The sorted numbers are “;for(int i(0);i8;i+)coutnums1i“ “;coutendl;double nums2=2.3,5.3,6.7,3.9,7.2,1.5;bubble(nums2,6);cout“The sorted numbers are “;for(i=0;i6;i+)coutnums2i“ “;coutendl;,3.模板实参的省略,模板实参的省略是有条件的。 以下四种情况模板实参不能省略: 从模板函数实参表获得的信息有矛盾。 需要获得特定类型的返回值,而不管参数的类型如何。

6、虚拟类型参数没有出现在模板函数的形参表中。 函数模板含有常规形参。,从模板函数实参表获得的信息有矛盾。,例如: template T add(T a,T b)return a+b; 若调用函数的语句为:cout(3.0,5); 其中,紧跟在函数名后的就是模板实参表,此时,编译系统生成如下的模板函数: int add(int a,int b)return a+b;,需要获得特定类型的返回值,而不管参数的类型如何。,例如, 如果需要add返回一个int型的值, 那么直接以add(a,b);形式调用即可。,虚拟类型参数没有出现在模板函数的形参表中。,由于虚拟类型参数没有出现在模板函数的形参表中,所以

7、调用时不可能从模板函数的实参表中获得相应的信息,因此无法省略。 例12.2 分析程序输出结果。,#include using namespace std; template T2 add(T1 a,T3 b)return a+b; void main() cout(3,5L)(3,5L)();,3. 模板类,模板类 在定义了类模板后,可根据需要生成相应的模板类。即,对模板参数,指定具体的类型。 例如,当指定AType 为int型时,生成模板类 array 利用模板类创建对象格式如下: array a1=10;,例12.4:,问题:分析程序输出结果。,#include #include temp

8、late class stack public:stack(int size);stack()delete stck;void push(T i);T pop();private:int tos,length;T *stck;,程序运行结果为: 9 8 7 6 5 4 3 2 1 0 22.5 20 17.5 15 12.5 10 7.5 5 2.5 0 a b c d e f g h i j,template stack:stack(int size)/构造函数 stck=new Tsize;if(!stck)cout“cannot allocate stack.n“;exit(1);len

9、gth=size;/栈长度tos=0; ,template void stack:push(T i)/入栈 if(tos=length)/满栈cout“Stack is full.n“;stcktos=i;tos+; ,template T stack :pop()/出栈 if(tos=0)cout“Stack underflow.n“;tos-;return stcktos; ,void main() stack a(10);/模板类stackstack b(10);/模板类stackstack c(10);/模板类stackfor(int i=0;i10;i+)a.push(i);for(

10、i=0;i10;i+) b.push(i*2.5);for(i=0;i10;i+) couta.pop() ;coutendl;for(i=0;i10;i+) coutb.pop() ;coutendl;for(i=0;i10;i+) c.push(char)j-i);for(i=0;i10;i+) coutc.pop() ;coutendl;,4.类模板的继承与派生,模板类的派生与普通类一样,也分为公有派生类、保护派生类和私有派生类三种。 模板派生类中成员的访问控制规则与普通类也是一样的。 下面给出常见的几种情况: 普通类继承类模板 模板类继承普通类 模板类继承模板类 模板类继承模板参数给出

11、的基类,普通类继承类模板,可以通过继承类模板的一个实例来声明一个类 ,例如:,template class TBaseT data; ; class Derived:public TBase ;,模板类继承普通类,模板类TDerived继承了普通类TBase,这种情况十分常见。 例如:,class TBase ; template class TDerived:public TBase T data; ;,模板类继承模板类,例如:,template class TBase T data1; ; template class TDerived:public TBase T2 data2; ;,模

12、板类继承模板参数给出的基类,继承哪个基类由模板参数决定。 例12.5 分析程序输出结果。,#include using namespace std; class BaseA public:BaseA()cout“BaseA founed“endl; ; class BaseB public:BaseB()cout“BaseB founed“endl; ;,template class BaseC private:T data; public:BaseC(T n=value):data(n)cout class Derived:public T public:Derived():T()cout“Derived founed“ z;/ BaseC作为基类 ,程序运行结果为: BaseA founed Derived founed BaseB founed Derived founed BaseC founed 3 Derived founed,类模板和模板类小结,类模板是一个类型参数化的样板,它是一组模板类的集合。 模板类是某个类模板的实例。 使用某个具体的类型来替换某个类模板的模板参数可以生产该类模板的一个模板类。 可以通过模板类再创建具体的对象。 类模板的作用:让类参数化,以加强其通用性,提供代码的重用率。,练习与作业,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 教育学

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