非视频教程-数据结构与算法版code test_第1页
非视频教程-数据结构与算法版code test_第2页
非视频教程-数据结构与算法版code test_第3页
非视频教程-数据结构与算法版code test_第4页
非视频教程-数据结构与算法版code test_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023/1/14主讲教师:四川大学计算机学院游洪跃

1主讲教师:游洪跃个人主页:

高级语言程序设计II四川大学计算机学院四川大学计算机学院2023/1/14主讲教师:四川大学计算机学院游洪跃

2教材:《C++面向对象程序设计》李涛主编游洪跃陈良银李琳等编高等教育出版社2006年2月出版2023/1/14主讲教师:四川大学计算机学院游洪跃

3本书内容

第1章绪论第2章C++类和对象第3章继承第4章多态性第5章模板第6章C++常见问题第7章VisualC++编程基础第8章对话框、常用消息、菜单和工具条第9章单文档界面和多文档界面第10章图形设备接口实验(待安排)2023/1/14主讲教师:四川大学计算机学院游洪跃

4提纲类模板及模板类第五章模板ARMVectorTableFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00132函数模板及模板函数模板的基本概念模板设计及应该实例32023/1/14主讲教师:四川大学计算机学院游洪跃

55.1模板的基本概念模板是C++支持多态性的一种工具。模板将用“类型参数”来完成不同的功能。使用模板可以让用户得到类或函数声明的一种通用模式。使得类中的某些数据成员或者成员函数的参数、返回值取得不同的类型。让类型成为参数2023/1/14主讲教师:四川大学计算机学院游洪跃

65.1.1模板的概念所谓模板,其实就是一种使用“数据类型”作为参数来产生一系列函数或类的机制。模板方便了更大规模的软件开发。减少了程序员编写代码的工作量。程序通用性增强2023/1/14主讲教师:四川大学计算机学院游洪跃

75.1.2为何需要使用模板//求两个整型数的极大值intGetMax(inta,intb) { return(a>b)?a:b;}//求两个长整型数的极大值longGetMax(longa,longb) { return(a>b)?a:b;}2023/1/14主讲教师:四川大学计算机学院游洪跃

8//求两个双精度型数的极大值doubleGetMax(doublea,doubleb) { return(a>b)?a:b;}//求两个字符型数的极大值charGettMax(chara,charb) { return(a>b)?a:b;} 2023/1/14主讲教师:四川大学计算机学院游洪跃

9是否可以将上述四个函数合成为一个函数啦?//Type用前述的int、long、double、char替换可得到上述四个函数。

TypeGetMax(Typea,Typeb){ return(a>b)?a,b;}难道可以生产函数?2023/1/14主讲教师:四川大学计算机学院游洪跃

10这实际上就是一种抽象。可以将数据类型说明为参数,以适用于其他数据类型,这就是模板。通过模板可以产生类或函数的集合,它们有能力操作不同的数据类型。因而也就不必要为每一种数据类型设计一个单独的类或函数。说明了结构相似的类和函数。2023/1/14主讲教师:四川大学计算机学院游洪跃

11模板分为类模板(classtemplate)和函数模板(functiontemplate)两种。在说明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的数据类型来确认是否匹配函数模板中对应的形参,然后生成一个重载函数。模板函数2023/1/14主讲教师:四川大学计算机学院游洪跃

12该重载函数的定义体与函数模板的函数定义体相同,但数据类型参数具体化了,称为模板函数(templatefunction)。同样,在说明了一个类模板之后,可以创建类模板的实例,称为模板类。实际上,将数据类型作为参数就得到了模板。将参数实例化就得到了模板类或者模板函数。模板类2023/1/14主讲教师:四川大学计算机学院游洪跃

135.2函数模板及模板函数函数模板是对一批模样相同的函数的说明描述,它不是某一个具体的函数。而模板函数则是将函数模板内的“数据类型参数”具体化后得到的重载函数(就是由模板而来的函数)。从哲学的抽象和具体的角度来说:函数模板是抽象的,而模板函数则是具体的。“人”和“本.拉登”的区别2023/1/14主讲教师:四川大学计算机学院游洪跃

14C语言中,使用不同函数名来表达相似功能;而C++中则用函数重载来表达。而使用函数模板,则只需要一段公共的模板描述代码即可。函数模板减少了程序员输入代码的工作量,是C++中功能最强的特性之一,是提高软件代码重用率的重要手段之一。2023/1/14主讲教师:四川大学计算机学院游洪跃

155.2.1函数模板的定义及生成模板函数函数模板大大增强了函数设计的通用性。使用函数模板的方法是;1、先说明函数模板,2、然后实例化成相应的模板函数,3、最后才可以调用模板函数,并执行。2023/1/14主讲教师:四川大学计算机学院游洪跃

16函数模板的说明形式一般如下:template<模板类型形参表><返回值类型><函数名>(模板函数形参表){//函数定义体}注意类型形参和函数形参的位置2023/1/14主讲教师:四川大学计算机学院游洪跃

17其中,<模板类型形参表>的类型可以是任何类型:包含基本数据类型,和类类型。每一个类型参数前都需要加前缀class。2023/1/14主讲教师:四川大学计算机学院游洪跃

18函数模板是一组函数的描述,不能直接执行,它需要实例化为模板函数后才能执行。函数模板并不是一个实实在在的函数。编译系统不会为它产生任何执行代码。该定义只是对某类函数的描述。一旦数据类型形参实例化以后,就产生一个实实在在的模板函数。实例化?2023/1/14主讲教师:四川大学计算机学院游洪跃

19例5-1:编写一个对具有n个元素的数组a[]求最大值的程序,要求将求最大值的函数设计成函数模板以适应不同的数组元素类型。smain5_1.cpp使用函数模板1,数组a的最大值,maxValue=10使用函数模板1,数组b的最大值,maxValue=9.9使用函数模板1,数组c的最大值,maxValue=c2023/1/14主讲教师:四川大学计算机学院游洪跃

20注意事项:函数模板的说明和定义必须在全局作用域。函数模板不能说明为类的成员函数。

另外,模板类型参数不具有隐式类型转换的作用。隐式类型转换?2023/1/14主讲教师:四川大学计算机学院游洪跃

215.2.2重载函数模板模板函数也可以重载。匹配过程有以下规定:1、首先匹配类型完全相同的重载函数。2、其次,才寻求函数模板来匹配。例5-2:具有函数模板和同名重载函数的匹配过程smain5_2.cpp

先重载函数,然后函数模板2023/1/14主讲教师:四川大学计算机学院游洪跃

222023/1/14主讲教师:四川大学计算机学院游洪跃

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=200调用函数模板2,maxValue=1002023/1/14主讲教师:四川大学计算机学院游洪跃

24从运行结果可知:GetMax(10,20)调用直接调用intGetMax(inta,intb)。注释掉charGetMax(chara,charb)以前,GetMax(‘A’,‘2’)调用该重载函数;注释掉charGetMax(chara,charb)以后,GetMax(‘A’,‘2’)调用了模板函数2,说明在匹配模板函数时,系统不会进行隐式类型转换以匹配重载函数,否则它就应该调用intGetMax(inta,intb)。GetMax(10,5.0)调用函数模板2。在重载函数中没有匹配版本,在函数模板中匹配,调用函数模板2。2023/1/14主讲教师:四川大学计算机学院游洪跃

25在例5_3中,将例5_2中函数模板2:“TypeXGetMax(TypeXtX,TypeYtY)”的抽象性降低,观察一下重载函数和函数模板的匹配。

smain5_3.cpp2023/1/14主讲教师:四川大学计算机学院游洪跃

26调用double,maxValue=65调用double,maxValue=20调用double,maxValue=200调用double,maxValue=20.01调用double,maxValue=20.02调用double,maxValue=65调用double,maxValue=100.03调用double,maxValue=20调用double,maxValue=20.04调用double,maxValue=20.052023/1/14主讲教师:四川大学计算机学院游洪跃

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

285.3类模板及模板类有时候,我们会遇到一些代码相似的类。ch5_4\sclass5_4_T.hch5_4\sclass5_4_T.cppch5_4\smain5_4.cppCInteger类和CReal类的声明及其成员函数的实现代码非常相似,这种相似性提供了进一步抽象的可能。可以定义一种用来生成CInteger类和CReal类的类模板,然后用这个抽象的类模板来生成具体的CInteger类和CReal类。2023/1/14主讲教师:四川大学计算机学院游洪跃

29类模板与函数模板类似,将数据类型定义为参数。具体化为模板类后,可以用于生成具体对象。类模板模板类2023/1/14主讲教师:四川大学计算机学院游洪跃

305.3.1类模板的定义及生成模板类template<类型形参表>class<类名>{ //类说明体};template<类型形参表><返回类型><类名><类型名表>::<成员函数1>(形参表){ //成员函数1定义体}2023/1/14主讲教师:四川大学计算机学院游洪跃

31它不是一个实实在在的类,只是类的描述,称为类模板(classtemplate)。类模板必须用类型参数将其实例化为模板类后,才能用来生成具体对象。在形参表中定义的每个类型,也都必须要使用关键词class。如果类型形参多于一个,则每个形参前都要使用关键词class。2023/1/14主讲教师:四川大学计算机学院游洪跃

32template<classT1,classT2,intexp1>classTClass{//};类模板TClass的第三个参数是表达式,而第一和第二个参数是类型参数。混用。2023/1/14主讲教师:四川大学计算机学院游洪跃

33使用类模板可以说明和定义任何类型的类。这种类被称为参数化的类。类是对象的抽象,那么类模板则是类的抽象。对类的抽象2023/1/14主讲教师:四川大学计算机学院游洪跃

34例5_5:采用类模板。s5_5\smain5_5.cpp

生产类的工厂?生产车间2023/1/14主讲教师:四川大学计算机学院游洪跃

35例5_5和例5_4程序运行的结果完全相同。例5_5程序的实现代码却少很多。例5_5还可以生成其他的很多功能类似的模板类,其适应范围大大增强了,比如:TNumber<char>、TNumber<long>等。在例5_4的程序中,要生成新类,势必要增加大量代码。这就是类模板的魅力所在。类模板就是用来生成类的工具。2023/1/14主讲教师:四川大学计算机学院游洪跃

365.3.2类模板的派生//用类模板派生出新的类模板template<classTyp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论