收藏 分享(赏)

C ++面向对象程序设计 第五章 模板.ppt

上传人:gnk289057 文档编号:7926407 上传时间:2019-05-30 格式:PPT 页数:44 大小:309.50KB
下载 相关 举报
C ++面向对象程序设计 第五章 模板.ppt_第1页
第1页 / 共44页
C ++面向对象程序设计 第五章 模板.ppt_第2页
第2页 / 共44页
C ++面向对象程序设计 第五章 模板.ppt_第3页
第3页 / 共44页
C ++面向对象程序设计 第五章 模板.ppt_第4页
第4页 / 共44页
C ++面向对象程序设计 第五章 模板.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、2019/5/30,主讲教师:四川大学计算机学院 *,1,主讲教师: 陈良银 个人主页: http:/ *,2,教材:C+面向对象程序设计,李涛 主编 游洪跃 陈良银 李琳等编高等教育出版社 2006年2月出版,2019/5/30,主讲教师:四川大学计算机学院 *,3,本书内容,第1章 绪论 第2章 C+类和对象 第3章 继承 第4章 多态性 第5章 模板 第6章 C+常见问题 第7章 Visual C+编程基础 第8章 对话框、常用消息、菜单和工具条 第9章 单文档界面和多文档界面 第10章 图形设备接口 实验 (待安排),2019/5/30,主讲教师:四川大学计算机学院 *,4,提纲,类模

2、板及模板类,第五章 模板,ARM Vector Table,FIQ,IRQ,(Reserved),Data Abort,Prefetch Abort,Software Interrupt,Undefined Instruction,Reset,1,3,2,函数模板及模板函数,模板的基本概念,模板设计及应该实例,3,2019/5/30,主讲教师:四川大学计算机学院 *,5,5.1 模板的基本概念,模板是C+支持多态性的一种工具。 模板将用“类型参数”来完成不同的功能。 使用模板可以让用户得到类或函数声明的一种通用模式。 使得类中的某些数据成员或者成员函数的参数、返回值取得不同的类型。,让类型成为

3、参数,2019/5/30,主讲教师:四川大学计算机学院 *,6,5.1.1 模板的概念 所谓模板,其实就是一种使用“数据类型”作为参数来产生一系列函数或类的机制。 模板方便了更大规模的软件开发。 减少了程序员编写代码的工作量。,程序通用性增强,2019/5/30,主讲教师:四川大学计算机学院 *,7,5.1.2 为何需要使用模板 /求两个整型数的极大值 int GetMax( int a, int b ) return( a b ) ? a : b; /求两个长整型数的极大值 long GetMax( long a, long b ) return( a b ) ? a : b; ,2019/

4、5/30,主讲教师:四川大学计算机学院 *,8,/求两个双精度型数的极大值 double GetMax( double a, double b ) return( a b ) ? a : b; /求两个字符型数的极大值 char GettMax( char a, char b ) return( a b ) ? a : b; ,2019/5/30,主讲教师:四川大学计算机学院 *,9,是否可以将上述四个函数合成为一个函数啦? /Type用前述的int、long、double、char替换可得到上述四个函数。Type GetMax( Type a, Type b ) return( a b )

5、? a, b; ,难道可以生产函数?,2019/5/30,主讲教师:四川大学计算机学院 *,10,这实际上就是一种抽象。 可以将数据类型说明为参数,以适用于其他数据类型,这就是模板。 通过模板可以产生类或函数的集合,它们有能力操作不同的数据类型。 因而也就不必要为每一种数据类型设计一个单独的类或函数。,说明了结构相似的类和函数。,2019/5/30,主讲教师:四川大学计算机学院 *,11,模板分为类模板(class template)和函数模板(function template)两种。 在说明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的数据类型来确认是否匹配函数模板

6、中对应的形参,然后生成一个重载函数。,模板函数,2019/5/30,主讲教师:四川大学计算机学院 *,12,该重载函数的定义体与函数模板的函数定义体相同,但数据类型参数具体化了,称为模板函数(template function)。 同样,在说明了一个类模板之后,可以创建类模板的实例,称为模板类。 实际上,将数据类型作为参数就得到了模板。将参数实例化就得到了模板类或者模板函数。,模板类,2019/5/30,主讲教师:四川大学计算机学院 *,13,5.2 函数模板及模板函数,函数模板是对一批模样相同的函数的说明描述,它不是某一个具体的函数。 而模板函数则是将函数模板内的“数据类型参数”具体化后得到

7、的重载函数(就是由模板而来的函数)。 从哲学的抽象和具体的角度来说:函数模板是抽象的,而模板函数则是具体的。,“人”和“本.拉登”的区别,2019/5/30,主讲教师:四川大学计算机学院 *,14,C语言中,使用不同函数名来表达相似功能;而C+中则用函数重载来表达。 而使用函数模板,则只需要一段公共的模板描述代码即可。 函数模板减少了程序员输入代码的工作量,是C+中功能最强的特性之一,是提高软件代码重用率的重要手段之一。,与宏定义的区别?,2019/5/30,主讲教师:四川大学计算机学院 *,15,5.2.1 函数模板的定义及生成模板函数 函数模板大大增强了函数设计的通用性。 使用函数模板的方

8、法是; 1、先说明函数模板, 2、然后实例化成相应的模板函数, 3、最后才可以调用模板函数,并执行。,2019/5/30,主讲教师:四川大学计算机学院 *,16,函数模板的说明形式一般如下: template (模板函数形参表) /函数定义体 ,注意类型形参和函数形参的位置,2019/5/30,主讲教师:四川大学计算机学院 *,17,其中,的类型可以是任何类型:包含基本数据类型,和类类型。,每一个类型参数前都需要加前缀class。,2019/5/30,主讲教师:四川大学计算机学院 *,18,函数模板是一组函数的描述,不能直接执行,它需要实例化为模板函数后才能执行。 函数模板并不是一个实实在在的

9、函数。 编译系统不会为它产生任何执行代码。 该定义只是对某类函数的描述。 一旦数据类型形参实例化以后,就产生一个实实在在的模板函数。,实例化?,2019/5/30,主讲教师:四川大学计算机学院 *,19,例5-1:编写一个对具有n个元素的数组a 求最大值的程序,要求将求最大值的函数设计成函数模板以适应不同的数组元素类型。 smain5_1.cpp,使用函数模板1,数组a的最大值,maxValue 10 使用函数模板1,数组b的最大值,maxValue 9.9 使用函数模板1,数组c的最大值,maxValue c,2019/5/30,主讲教师:四川大学计算机学院 *,20,注意事项: 函数模板的

10、说明和定义必须在全局作用域。 函数模板不能说明为类的成员函数。 另外,函数模板有一个特点,虽然模板参数T可以实例化成各种类型,但是采用同一模板参数T的各参数之间必须保持完全一致的类型。 另外,模板类型参数不具有隐式类型转换的作用。,隐式类型转换?,2019/5/30,主讲教师:四川大学计算机学院 *,21,5.2.2 重载函数模板 模板函数也可以重载。匹配过程有以下规定: 1、首先匹配类型完全相同的重载函数。 2、其次,才寻求函数模板来匹配。 例5-2:具有函数模板和同名重载函数的匹配过程 smain5_2.cpp,先重载函数,然后函数模板,2019/5/30,主讲教师:四川大学计算机学院 *

11、,22,2019/5/30,主讲教师:四川大学计算机学院 *,23,使用函数模板1,数组a的最大值,maxValue 10 使用函数模板1,数组b的最大值,maxValue 9.9 使用函数模板1,数组c的最大值,maxValue c 调用int,maxValue 20 调用long,maxValue 201 调用double,maxValue 2 调用函数模板2,maxValue char=A 调用函数模板2,maxValue 10 调用函数模板2,maxValue 11.1 调用函数模板2,maxValue 22 调用函数模板2,maxValue A 调用函数模板2,maxValue 20

12、0 调用函数模板2,maxValue 100,2019/5/30,主讲教师:四川大学计算机学院 *,24,从运行结果可知:GetMax( 10, 20 )调用直接调用int GetMax( int a, int b )。 注释掉char GetMax( char a, char b )以前,GetMax( A, 2 )调用该重载函数; 注释掉char GetMax( char a, char b )以后, GetMax( A, 2 )调用了模板函数2, 说明在匹配模板函数时,系统不会进行隐式类型转换以匹配重载函数,否则它就应该调用int GetMax( int a, int b )。 GetM

13、ax( 10, 5.0 )调用函数模板2。在重载函数中没有匹配版本,在函数模板中匹配,调用函数模板2。,2019/5/30,主讲教师:四川大学计算机学院 *,25,在例5_3中,将例5_2中函数模板2:“TypeX GetMax( TypeX tX, TypeY tY )”的抽象性降低,观察一下重载函数和函数模板的匹配。smain5_3.cpp,2019/5/30,主讲教师:四川大学计算机学院 *,26,调用double,maxValue 65 调用double,maxValue 20 调用double,maxValue 200 调用double,maxValue 20.01 调用double

14、,maxValue 20.02 调用double,maxValue 65 调用double,maxValue 100.03 调用double,maxValue 20 调用double,maxValue 20.04 调用double,maxValue 20.05,2019/5/30,主讲教师:四川大学计算机学院 *,27,在例5_3中,注释掉函数模板2。 从运行结果可知,程序调用了所有类型不匹配的相关函数,这是隐式类型转换的结果。 但是,当将函数模板2放出来以后,凡是两个类型不一致的函数调用都不能够编译通过。 这说明模板参数不具有隐式转换能力。,都不匹配的咋办?,2019/5/30,主讲教师:四

15、川大学计算机学院 *,28,1、第一,利用重载函数来寻找完全匹配重载函数,没有的话转入第二步。 2、第二,利用函数模板来寻找完全匹配项,如没有则报错。,都不匹配的则报错。,2019/5/30,主讲教师:四川大学计算机学院 *,29,思考:在例5_3中,如果再增加如下函数: int GetMax( int a, int b ) cout b ) ? a : b; 程序其余代码不改变,请问会出现什么结果?,GetMax( 10, 5.0 )二义性,2019/5/30,主讲教师:四川大学计算机学院 *,30,5.3 类模板及模板类,有时候,我们会遇到一些代码相似的类。 ch5_4sclass5_4_

16、T.h ch5_4sclass5_4_T.cpp ch5_4smain5_4.cpp CInteger类和CReal类的声明及其成员函数的实现代码非常相似,这种相似性提供了进一步抽象的可能。 可以定义一种用来生成CInteger类和CReal类的类模板,然后用这个抽象的类模板来生成具体的CInteger类和CReal类。,2019/5/30,主讲教师:四川大学计算机学院 *,31,类模板与函数模板类似,将数据类型定义为参数。 具体化为模板类后,可以用于生成具体对象。 所以类模板描述了代码类似的部分类的集合。,类模板 模板类,2019/5/30,主讲教师:四川大学计算机学院 *,32,5.3.1

17、 类模板的定义及生成模板类,template class /类说明体 ;template :(形参表) /成员函数1定义体 ,2019/5/30,主讲教师:四川大学计算机学院 *,33,与函数模板中的意义一样。成员函数定义中的是类型形参的使用。 它不是一个实实在在的类,只是类的描述,称为类模板(class template)。 类模板必须用类型参数将其实例化为模板类后,才能用来生成具体对象。 在形参表中定义的每个类型,也都必须要使用关键词class。 如果类型形参多于一个,则每个形参前都要使用关键词class。,2019/5/30,主讲教师:四川大学计算机学院 *,34,template cl

18、ass TClass / ; 类模板TClass的第三个参数是表达式,而第一和第二个参数是类型参数。,混用。,2019/5/30,主讲教师:四川大学计算机学院 *,35,使用类模板可以说明和定义任何类型的类。 这种类被称为参数化的类。 类是对象的抽象,那么类模板则是类的抽象。,对类的抽象,2019/5/30,主讲教师:四川大学计算机学院 *,36,例5_5:采用类模板。 s5_5smain5_5.cpp,生产类的工厂? 生产车间,2019/5/30,主讲教师:四川大学计算机学院 *,37,例5_5和例5_4程序运行的结果完全相同。 例5_5程序的实现代码却少很多。 例5_5还可以生成其他的很多

19、功能类似的模板类,其适应范围大大增强了,比如:TNumber、TNumber等。 在例5_4的程序中,要生成新类,势必要增加大量代码。 这就是类模板的魅力所在。 类模板就是用来生成类的工具。,2019/5/30,主讲教师:四川大学计算机学院 *,38,5.3.2 类模板的派生 / 用类模板派生出新的类模板 template class TSet( ) : public TList /派生类类模板定义。 ;,2019/5/30,主讲教师:四川大学计算机学院 *,39,从模板类派生新类 不同点:从模板类派生,而非从类模板派生。 /用模板类派生派生类 template class TSet( ) :

20、 public TList /派生类模板定义。 ;,2019/5/30,主讲教师:四川大学计算机学院 *,40,5.4 模板设计应用实例,例5_6,从一个链表类模板派生出了集合类模板。 为了简单,只在表头插入,可以删除指定值的节点,但限定一次只能够删除一个节点。s5_6smain5_6.cpp,2019/5/30,主讲教师:四川大学计算机学院 *,41,从运行结果看:在集合sIntSet中第二次插入24节点是无效的,而在sIntList中两次插入24都有效。 该程序实现了通过类模板来继承的例子。 从模板类继承的例子: s5_6smain5_6_0.cpp,节点的值依次为: 24; 96; 48; 24; 12; 节点的值依次为: 96; 48; 24; 12; 节点的值依次为: 96; 48; 24; 12; 节点的值依次为: 96; 48; 12;,2019/5/30,主讲教师:四川大学计算机学院 *,42,习题,课后习题、作业 习题1 习题3 习题4,2019/5/30,主讲教师:四川大学计算机学院 *,43,测试题,http:/211.83.120.3在线测试,2019/5/30,主讲教师:四川大学计算机学院 *,44,Thanks!,The End,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报