




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
解析C+面向对象程序设计,第7章 模板类的再抽象,2019/7/22,第7章模板-类的再抽象,2,内容提要,STL标准模板库的形成原因 函数模板和模板函数 类模板与模板类 STL标准模板库的简单应用,2019/7/22,第7章模板-类的再抽象,3,7.1 标准模板库的设计问题 【例7-1】能否设计一个“通用函数”,该函数能对各种数据类型的数组(基本类型数组或对象数组)进行倒序? 我们首先想到用已学知识-重载来解决该问题,提出问题,2019/7/22,第7章模板-类的再抽象,4,【例7-2】函数重载实现倒序。,/ example7_2.cpp /对整型数组地址begin到end-1的元素倒序 void Reverse(int* begin,int* end) /首尾元素交换 /然后begin指针增1,end指针减1 for(;begin!=end ,2019/7/22,第7章模板-类的再抽象,5,【例7-2】续,/对实型数组地址begin到end-1的元素倒序 void Reverse(float* begin,float* end) for(;begin!=end ,2019/7/22,第7章模板-类的再抽象,6,函数重载不仅方便用户对函数名的记忆,而且更主要的是完善了同一个函数的代码功能,给调用带来了许多方便。 它允许多个同名的函数存在,但同名的各个函数的形参必须有区别:要从形参的类型、个数或顺序几个方面来区分。,2019/7/22,第7章模板-类的再抽象,7,显然,如果需要处理所有数据类型的参数,则需要更多的代码进行函数重载。其冗余增加。,2019/7/22,第7章模板-类的再抽象,8,分析问题,从例7-2的代码可以看出,两个重载函数从算法上来看是一样的,整个程序的区别仅仅在于函数所处理数据类型的不同。如果可以将数据类型参数化,那么我们只需要编写一个函数,就可以解决各种数据类型数组的倒序问题,即函数模板。 下面介绍模板:,2019/7/22,第7章模板-类的再抽象,9,7.2 模板的概念,模板(Template) 使用参数化的C+类型创建相应的函数和类,分为两种类型: 函数模板(Function Template) 类模板(Class Template) 一个模板并非一个实实在在的类或函数,仅仅是一个类或函数的描述,是参数化的函数和类。,2019/7/22,第7章模板-类的再抽象,10,7.3 函数模板,先看一个例子,template T max(T a,T b) return (ab)?a:b; ,2019/7/22,第7章模板-类的再抽象,11,函数模板的定义,函数模板的定义格式,template () ,2019/7/22,第7章模板-类的再抽象,12,模板函数的生成,函数模板是对一组函数的描述,它以任意类型T为参数及函数返回值。 它不是一个实实在在的函数,编译系统并不产生任何执行代码。 当编译系统在程序中发现有与函数模板中相匹配的函数调用时,便生成一个重载函数,该重载函数的函数体与函数模板的函数体相同。,2019/7/22,第7章模板-类的再抽象,13,【例7-3】示例函数模板的定义,实现对不同数据类型数组进行排序。 /example7_3.cpp,2019/7/22,第7章模板-类的再抽象,14,/对任意类型数组地址begin到end-1的元素由小到大排序 template void Sort(T* begin,T* end) T* pi,*pj; for(pi=end;pibegin;pi-) for(pj=begin+1;pj*pj) /采用冒泡法排序 T temp; temp=*(pj-1); *(pj-1)=*pj; *pj=temp; ,2019/7/22,第7章模板-类的再抽象,15,7.4 类模板,类模板的定义:,template class ;,2019/7/22,第7章模板-类的再抽象,16,类模板中的成员函数的定义,可以放在类模板的定义体中(此时与类中的成员函数的定义方法一致) 也可以放在类模板的外部定义成员函数,此时成员函数的定义格式如下:,template :() ,2019/7/22,第7章模板-类的再抽象,17,注意!,在类模板外定义成员函数时,每一个函数前均加上: template ,2019/7/22,第7章模板-类的再抽象,18,类模板的使用,利用类模板定义的只是对类的描述,它本身还不是一个实实在在的类。要定义类模板的对象(即实例),需要用下列格式的语句: 类模板名 类模板名 (实际参数表); 【例7-4】栈类模板的设计。设计如下的类图:,2019/7/22,第7章模板-类的再抽象,19,2019/7/22,第7章模板-类的再抽象,20,7.5 解决问题,下面我们可以来实现7.1节所提到的问题了。/example7_1.cpp /自定义函数模板,实现对任意类型数组倒序 template void Reverse(T* _F,T* _L) /_F表示首指针,指向首元素; /_L表示尾指针,指向最后一个元素。 for(; _F != _L ,2019/7/22,第7章模板-类的再抽象,21,定义嵌套类的语法格式为: class 外部类名 public: class 嵌套类名 ; ;,2019/7/22,第7章模板-类的再抽象,22,7.6 STL简介,一般而言,STL(Standard Template Library)作为一个泛型化的数据结构和算法库,并不牵涉具体语言(当然,在C+里,它被称为 STL)。也就是说,如果条件允许,用其他语言也可以实现。这里所说的条件,主要是指类似于“模板”这样的语法机制。,2019/7/22,第7章模板-类的再抽象,23,STL与C+标准函数库,STL是最新的C+标准函数库中的一个子集,这个庞大的子集占据了整个库的大约80%的分量。而作为在实现STL过程中扮演关键角色的模板则充斥了几乎整个C+标准函数库。在这里,我们有必要看一看C+标准函数库里包含了哪些内容,其中又有哪些是属于标准模板库(即STL)的。,2019/7/22,第7章模板-类的再抽象,24,图7-2 STL和C+标准函数库,2019/7/22,第7章模板-类的再抽象,25,使用STL,1.适配器(adapter) 适配器是用来修改其他组件接口的STL组件,是带有一个参数的类模板(这个参数是操作的值的数据类型)。STL定义了3种形式的适配器:容器适配器,迭代器适配器,函数适配器。,2019/7/22,第7章模板-类的再抽象,26,2.泛型算法(algorithm) 包含头文件#inlcude 。标准库为容器类型定义的操作很少,并没有为每个容器实现更多的操作。因为这部分操作可以抽象出来为所有的容器工作,那就是泛型算法。所谓“泛型”是指这些算法可以应用于多种容器类型上,而容器内的元素类型也可以多样化。 【例7-5】reverse()和copy()算法的使用。 【例7-6】find(),search()和count()算法的使用 【例7-7】sort(),merge()和includes()算法的使用。,2019/7/22,第7章模板-类的再抽象,27,3.迭代器(itertor) 包含头文件#include。迭代器实际上是一种泛化指针,如果一个迭代器指向了容器中的某一成员,那么迭代器将可以通过自增自减来遍历容器中的所有成员。迭代器是联系容器和算法的媒介,是算法操作容器的接口。在运用算法操作容器的时候,我们常常在不知不觉中已经使用了迭代器。 【例7-8】迭代器的使用。,2019/7/22,第7章模板-类的再抽象,28,4.函数对象(functor或者funtion objects) 需包含头文件#include 。 函数对象又称之为仿函数。函数对象将函数封装在一个对象中,使得它可作为参数传递给合适的STL算法,从而使算法的功能得以扩展。可以把它当作函数来使用。用户也可以定义自己的函数对象。下面让我们来定义一个自己的函数对象。 【例7-9】函数对象的使用。,2019/7/22,第7章模板-类的再抽象,29,应用举例,【例7-10】利用STL提供的容器和算法,重新实现7.1节提到的问题。,2019/7/22,第7章模板-类的再抽象,30,7.7 举一反三,【例7-11】设计一个模板类,用于对一个有序数组采用二分法查找元素并给出下标。 【例7-12】利用STL提供的容器和算法,对一组单词,求开头字母为“S”的单词个数。,2019/7/22,第7章模板-类的再抽象,31,本章小结,本章从重载机制的不足引出模板的原理。模板分为函数模板和类模板, 函数模板是对一组函数的描述,它以任意类型T为参数及函数返回值。类模板是对一批仅有成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个家族创建一个类模板。并通过对函数模板和类模板的编写应
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 慢病防控体系建设与实施策略
- VR在医学领域的应用
- 护理白内障查房
- 异位妊娠常规护理规范
- 护理人员晨间护理工作规范
- 讲好中医故事护理
- 幼儿园春季传染性疾病防控指南
- 小儿肝脏肿瘤诊疗与研究进展
- 感冒急性鼻炎护理
- 护理技术操作说课
- 2025展览馆装饰工程合同范本
- 《科普技巧常识》课件
- 2025年中国全电脑横机市场现状分析及前景预测报告
- 2019-2025年房地产经纪协理之房地产经纪操作实务过关检测试卷B卷附答案
- 初中历史明清时期的科技与文化 课件 2024-2025学年统编版七年级历史下册
- 2025年上半年发展对象题库(含答案)
- 大连银行招聘笔试真题2024
- 输血管理制度
- 信息必刷卷04(广东省卷专用)2025年中考数学(原卷版)
- 膝关节韧带损伤护理查房
- 2025科技辅导员培训
评论
0/150
提交评论