C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章 模板

上传人:E**** 文档编号:89188230 上传时间:2019-05-21 格式:PPT 页数:40 大小:315.50KB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章  模板_第1页
第1页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章  模板_第2页
第2页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章  模板_第3页
第3页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章  模板_第4页
第4页 / 共40页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章  模板_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章 模板》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第9章 模板(40页珍藏版)》请在金锄头文库上搜索。

1、C+面向对象程序设计教学内容,第1章 C+概述 第2章 类和对象 第3章 面向对象程序设计概述 第4章 进一步学习类和对象 第5章 堆与复制构造函数 第6章 继承性:派生类 第7章 运算符重载 第8章 虚函数和多态性 第9章 模板 第10章 类库和C+的标准模板库STL 第11章 输入输出流 第12章 异常处理,第9章 模板,9.1 模板的概念 9.2 函数模板 9.3 重载模板函数 9.4 类模板的定义 9.5 使用类模板 9.6 应用举例,问题的引入,很多算法本身的描述其实与其所涉及数据的类型是无关的。 但是,高级语言大多数都是基于类型系统的语言,当用高级语言表达算法的实现时,就必须明确指

2、出其具体的数据类型, 这样以来就必然导致同一个算法有多个不同的实现(针对不同的数据类型)。 从而使工作量加大,使用麻烦,维护困难。 例:将两个数进行交换 (请同学们想一想共有几种方案?),解决方案一:宏定义,在C语言中,宏定义是解决类型无关算 法的首选解决方案。例: #define max(x, y) ( (x)(y) ? (x):(y) ); 宏定义有如下的缺点: 重复计算 只能处理简单的情况 例如:这里的 Swap(x,y) 使用宏定义就不好处理。,解决方案二:用C语言的函数,void SwapI(int *x, int *y) int temp; temp = *x; *x = *y;

3、*y = temp; void SwapF(float *x, float *y) float temp; temp = *x; *x = *y; *y = temp; ,从上面的实现可以看出,这种方案不仅实现上浪费很大,而且使用起来非常的不方便(不同的函数名)。,解决方案三: C+函数名重载,void Swap (int ,与C语言相比,C+的函数名重载让使用者大大地得到了解放,但实现者还是需进行大量的重复性劳动。,解决方案四:模板,template void swap(T ,所谓模板是一种是将类型参数化来产生一系列函数或类的机制。,9.1 模板的概念,模板的英文为template,又可译作

4、样板。 C+中的模板可以用来设计与数据类型无关的通用算法。 这样的通用算法能够适用不同场合下不同的数据类型。 通过针对不同的数据类型实例化这些模板,可以实现代码重用,从而达到提高软件生产率的目的。,模板的作用,通过模板可以产生类或函数的集合,使它们操作不同的数据类型, 从而避免需要为每一种数据类型都编写一个单独的类或函数。,什么是模板template?,所谓模板是一种是将类型参数化来产生一系列函数或类的机制。,9.2 函数模板,template ret_type func_name ( parameter list ) / body of function type是函数模板所使用的数据类型的

5、占位符名称,又称为模板参数。 将type实例化的类型称为模板实参,用模板实参实例化函数模板得到的函数称为模板函数。,函数模板的两种实例化方式,/显式实例化 /隐式实例化 #include using namespace std; template T min(T a, T b) return (ab)?a:b; ,函数模板的两种实例化方式(续),int main( ) double dobj1=1.1, dobj2=2.2; char cobj1=c, cobj2=W; int i=12,j= 68; cout(i, cobj1 )(cobj2, j )endl; return 0; ,使用整

6、型类型int显式实例化。,使用double隐式实例化,使用字符类型char显式实例化,实例:求绝对值的函数模板,#include using namespace std; template X myabs(X val) return val 0 ? -val : val; int main( ) cout myabs(-10) n; / integer abs cout myabs(-10.0) n; / double abs cout myabs(-10L) n; / long abs cout myabs(-10.0F) n; / float abs return 0; ,定义多个重载函数

7、使代码显得冗长,/ 对于整数类型 int max(int a,int b) return (ab)?a:b; / 对于长整数类型 long max(long a, long b) return (ab)?a:b; / 对于单精度浮点数 float max(float a,float b) return (ab)?a:b; / 对于双精度浮点数 double max(double a, double b) return (ab)?a:b; ,如果使用函数模板就可以减少这些不必要的重复。例如: template type max(type a, type b) return (ab)?a,b; 可

8、见,模板可以大大提高程序代码的灵活性,减少源代码长度。从而减轻程序员的负担。,模板函数的代码更加简洁,函数模板与函数重载,在每个重载函数的函数体中,可以执行不同的行为。 但是,函数模板的所有实例都必须执行同样的行为只有数据类型可以不同。 void outdata(int i) cout i; void outdata(double d) cout d * 3.1416; ,这些函数不能用函数模板来实现,函数模板实例化时不支持数据类型的自动转换 当用隐式方式时,下面的方式将是一种错误: swap(i,c); 因为 i 和 c1的类型不一致,无法实例化函数模板 swap ( T& x, T&y)。

9、 但是, 当用显式方式将其声明为: void swap(int&,int&) 后,则可以合法去调用了。,注意,函数模板小结,无论操作的是什么类型的数据,许多算法在逻辑上是相同的。 通过建立函数模板,可以不依赖于任何数据类型来描述算法。 函数模板定义了一套适用于各种数据类型数据的一般操作。 函数模板是描述通用算法的强有力的手段。,9.3 重载函数模板,/max.h template TYPE max(TYPE a, TYPE b) return (ab ? a : b); template TYPE max(TYPE a, TYPE b, TYPE c) TYPE t; t = (ab) ? a

10、 : b; return (tc) ? t : c; 注:这种重载是指参数个数不同,而不是类型不同。,实例化函数模板时自动匹配,#include “iostream.h” #include “max.h” int main( ) char * max1; int x=10,y=20,max2; double a=10.3,b=21.7,c=14.5,max3; max2=max(x,y); max3=max(a,b,c); max1=max(“XYZ“,“ABC“); cout“The maximum of “x “ and “y“ is: “max2endl; cout“The maximu

11、m of “a“,“ b“ and “c“ is: “max3endl; cout“The maximum of“XYZ“and“ABC“is: “max1endl; return 0; ,输出结果分析,其结果是: The maximum of 10 and 20 is: 20 The maximum of 10.3,21.7 and 14.5 is: 21.7 The maximum of “XYZ“ and “ABC “ is: ABC,为什么会出错?如何改正这个错误?,出错的原因,当用char * 实例化函数模板max时,得到的模板函数如下: char * max(char * a, c

12、har * b) return (ab)?a:b; 它所比较的是两个字符串存储单元地址的大小,而不是两个字符串的内容。,改正错误的方法,只要用一个普通的函数进行重载就可以了,比如: char* max(char* a, char* b) return (strcmp(a, b)0 ? a : b); (refer to example9_4a),一般的函数重载函数模板,即用一个非函数模板重载一个同 名的函数模板。 目的是用一般函数来完善或者弥补模板函数所描述的问题的漏洞。 例:用 char* 实例化上例就会出现问题。,下面两个声明将指同一个函数模板,Template T1 max(T1 a ,

13、T1 b) return (ab) ? a: b; Template T2 max( T2 a, T2 b ) return (ab) ? a: b; ,因为T1和T并不指某个具体的类型,当用: int max( int , int); 时,编译器将不知道用那一个模板将其实例化,从而产生二义性错误。,二义性错误,重载函数的调用次序,寻找一个参数完全匹配的函数,若找到就调用之。 否则,寻找一个函数模板,将其实例化产生一个匹配的函数,若有则调用之。 否则,在重载函数中找有无通过类型转换可产生参数匹配的函数,若有则调用之。 若通过以上三步均没找到,则出现无匹配函数的错误。若在某一步上同时有多于一个的

14、选择,则为二义性错误。,9.4 类模板的定义,问题引入: 与函数模板相似,我们在设计类时也往往会遇到由于数据类型的不同而不得不重复地进行类的设计,而这些类的形式是十分相象的,基于象引入函数模板同样的原因,C+引入了类模板机制。 例:栈类模板,通用栈解决方案一:继承,通用栈解决方案二:模板,const int SIZE=10; template class stack T stckSIZE; / 使用数组实现堆栈 int tos; / top-of-stack 堆栈顶部位置 public: stack(); / constructor void push(T ch); / 将数据压入堆栈 T p

15、op(); /从堆栈弹出数据 ;,类模板定义的一般形式,template class 类模板名 /类体 ;,成员函数在类模板的体外实现,如果成员函数在类模板的体外实现,则每个成员函数前都必须用与声明该类模板一样的方法声明: template 使这样的成员函数成为一个函数模板。,成员函数在类模板的体外实现实例,template void stack:push(T d) if(tos=SIZE) cout T stack:pop( ) if(tos=0) cout “Stack is emptyn“; return 0; / return null on empty stack tos-; return stcktos; ,9.5 使用类模板,类模板必须显式实例化为模板类后才能使用,如: stack 就产生一个整形的模板类。 类模板必须显式实例化后,才能生成对象: 模板名 对象名(值实参表); stack int_stack;,安全数组模板类实例,/example9_6 const int SIZE = 10; template class atype AType aSIZE; publ

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

最新文档


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

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