版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c+语言程序设计杨国兴 张东玲 彭涛中国水利水电出版社第7章 模板7.1 函数模板7.2 模板函数的覆盖7.3 类模板7.1 函数模板1. 问题的提出 重载函数可以解决功能相同或相似的函数使用同一个函数名的问题。 第7章 模板void swap(float &x, float &y)float t =x;x = y;y = t; 实际代码量并未实际代码量并未减少。可使用函数模减少。可使用函数模板减少大量代码。板减少大量代码。7.1 函数模板2. 函数模板的定义 template 或 类型名 函数名(参数表) 函数体 函数模板就像是一个带有类型参数的函数(参数t即为类型),编译程序会根据实际参数
2、的类型确定参数的类型。第7章 模板template 类型名 函数名(参数表)函数体例7.1 定义用于变量交换的函数模板#include using namespace std;template void swap(t &x, t &y)t temp=x;x=y;y=temp;void main(void)char a=a, b=b;int c=123, d=456;double x=12.3, y=45.6;swap(a, b);swap(c, d);swap(x, y);cout a , b endl;cout c , d endl;cout x , y endl;第7章 模板t本身是一个类
3、型参数,在调用函本身是一个类型参数,在调用函数数swap()时,编译程序会根据()时,编译程序会根据实际参数的类型确定实际参数的类型确定t的类型。的类型。 例7.2 插入排序函数模板,使用插入排序函数模板可以为不同数据类型的数组排序,如整型、字符型、实型等等,为了使程序具有通用性,设计函数模板insertionsort()。 插入排序的基本思想:每一步将一个待排序的元素按其关键字值的大小插入到已排序序列的合适位置,直到待排序元素全部插入完为止。第7章 模板例7.2 (续一) template void insertionsort(t a, int n) int i, j; t temp; fo
4、r (i = 1; i 0 & temp =aj-1结束循环时,结束循环时,j便是应插入的位置便是应插入的位置 /当遇到当遇到j=0结束循环时,则结束循环时,则0是应插入的位置。是应插入的位置。 aj = aj-1; /将元素逐个后移,以便找到插入位置时可立即插入。将元素逐个后移,以便找到插入位置时可立即插入。 j-; aj = temp; 第7章 模板例7.2 (续二) #include using namespace std;void main() int a10=2,4,1,8,7,9,0,3,5,6; double b10=12.1, 24.2, 15.5, 81.7, 2.7, 5.
5、9, 40.3, 33.3, 25.6, 4.6; insertionsort(a,10); insertionsort(b,10); cout a0 a1 a2 a3 ; cout a4 a5 a6 a7 ; cout a8 a9 endl; cout b0 b1 b2 b3 ; cout b4 b5 b6 b7 ; cout b8 b9 endl; 第7章 模板 例7.3 使用函数模板产生的二意性 #include using namespace std;template t max(t a, t b)return ab?a:b;void main(void)int a = max(10.
6、5, 20);double b = max(10, 20.6);cout a endl;cout b endl; 第7章 模板产生二意性,系统不能确定将其中的一产生二意性,系统不能确定将其中的一个参数由整数转化为实数,还是应该将个参数由整数转化为实数,还是应该将另一个参数由实数转化为整数另一个参数由实数转化为整数 。可使用强制类型转换解决:可使用强制类型转换解决:int a =max( (int)10.5, 20);double b =max( (double ) 10, 20.6); 返 回7.2 模板函数的覆盖 下列函数模板: template t max(t a, t b) retum
7、ab?a:b; 对于简单的数据类型,如整型、实型、字符型数据,这个模板能够正常工作。对于字符串,用上述模板就会出现问题,因为对于字符串,不能使用运算符“”,要为其编写独立的max()函数。 我们将函数模板生成的函数称为模板函数。如果某一函数的函数原型与函数模板生成的函数(模板函数)原型一致,称该函数为模板函数的覆盖函数。第7章 模板例7.4 模板函数的覆盖 #include #include using namespace std;template t max(t a, t b)return ab?a:b;char *max(char *x, char *y)return strcmp(x,
8、y) 0 ? x :y;void main(void)char *p=abcd, *q=efgh;p=max(p, q);int a =max(10, 20);float b =max(10.5, 20.6);cout p endl;cout a endl;cout b endl;第7章 模板7.2 模板函数的覆盖在进行函数调用时,编译程序采用如下策略确定调用哪个函数:(1)首先寻找一个实参与形参完全匹配的覆盖函数,如果找到,则调用该函数(2)如果能通过函数模板生成实例函数,并且参数匹配,则调用该函数。(3)通过强制类型转换,寻找能够与实参匹白的覆盖函数,或通过函数模板生成的实例函数、如果找到
9、则调用该函数。(4)如果所有努力失败,则给出出错信息。第7章 模板 返 回7.3 类模板1. 问题的提出第7章 模板对应的类模板:对应的类模板:template class a t i;public: a(t a) void set (t b) ;这两个类的方法都一这两个类的方法都一样,只是一个数据类样,只是一个数据类型是整型,另一个数型是整型,另一个数据类型是实型。可以据类型是实型。可以使用类模板简化代码使用类模板简化代码 类模板也称为参数化类模板也称为参数化的类,用于为类型相的类,用于为类型相似的类定义一种通用似的类定义一种通用模式模式7.3 类模板2. 类模板的定义template cl
10、ass 类模板名 成员声明 如果需要在类模板外定义类模板的成员函数,格式如下: template 类型 类模板名:函数名(参数表) 函数体 第7章 模板7.3 类模板2. 类模板的定义(续) 使用类模板建立对象的语法如下: 类模板 对象1,对象2,; 系统会根据实参的类型,生成一个类(称为模板类),然后建立该类的对象。即对模板实例化生成类,再对类实例化生成对象。第7章 模板例7.5 定义数组类的类模板,并利用成员函数对数组中的元素初始化。#include using namespace std;template class myarraypublic:myarray(int nsize,t i
11、nitval);myarray()delete m_parray;t &operator(int nindex) /重载运算符用于取得数组的元素return m_parraynindex; void show(int nnumelems, char *pszmsg= , bool boneline=true);void sort(int nnumelems);protected:t *m_parray; /保存数组起始地址int m_nsize; /数组的长度;第7章 模板例7.5 (续一)templatemyarray:myarray(int nsize,t initval)m_nsize=
12、(nsize1)? nsize:1;m_parray=new tm_nsize;for(int i=0;im_nsize;i+)m_parrayi=initval; templatevoid myarray:show(int nnumelems, char *pszmsg, bool boneline)cout pszmsgendl;if(boneline)for(int i=0;innumelems;i+)cout m_parrayi ;cout endl;elsefor(int i=0;innumelems;i+)cout m_parrayiendl;第7章 模板构造函数为构造函数为m_n
13、size赋值,并为数组申赋值,并为数组申请存储空间,将数组的每个元素都赋值请存储空间,将数组的每个元素都赋值为为initval。 成员函数成员函数show()显示数组元()显示数组元素的值,元素的个数由第一个参素的值,元素的个数由第一个参数指定,第二个参数为输出数组数指定,第二个参数为输出数组元素值之前,输出的提示信息,元素值之前,输出的提示信息,第三个参数确定数组元素是显示第三个参数确定数组元素是显示在一行上,还是多行。在一行上,还是多行。 例7.5 (续二)templatevoid myarray:sort(int nnumelems)int i, j; t temp; for (i =
14、1; i 0 & temp m_parrayj-1) m_parrayj = m_parrayj-1; j-; m_parrayj = temp; 第7章 模板成员函数成员函数sort()使用插入排序法对数()使用插入排序法对数组元素排序(升序),其参数是数组中组元素排序(升序),其参数是数组中元素的个数。元素的个数。 例7.5 (续三)void main()int narr10=89,34,32,47,15,81,78,36,63,83;int carr10=c,w,r,y,k,j,x,z,y,s;myarray integerarray(10,0);myarray chararray(10
15、, );for(int i=0;i10;i+)integerarrayi=narri;for(i=0;i10;i+)chararrayi=carri;integerarray.show(10,unsorted array is: );integerarray.sort(10);integerarray.show(10,sorted array is: );cout endl ;chararray.show(10,unsorted array is: );chararray.sort(10);chararray.show(10,sorted array is: );cout endl; 第7章
16、模板定义了两个类模板对象,分别为定义了两个类模板对象,分别为int型和型和char型,数组元素分别被初始化为型,数组元素分别被初始化为0和和空格空格例7.6 使用缺省参数定义数组的类模板#include using namespace std;template class arrayt *data;int size;public:array(int);array();t &operator(int); 第7章 模板注意:函数模板不能定义缺省参数,而类模板却可以定义缺省参数。例7.6 (续)void main(void)int i;array l1(10); /等价于array l1(10)ar
17、ray l2(20); for(i=0; i10; i+)l1i = i;for(i=0; i20; i+)l2i = a+i;for(i=0; i10; i+)cout l1i ;cout endl;for(i=0; i20; i+)cout l2i ;cout endl;第7章 模板 例7.7 折半查找函数模板第7章 模板基本思想:对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。比如在如下数组中查找值为48的元素: 例7.7 (续一)template int bins
18、earch(t list, int n, t key)int mid, low, high;t midvalue;low=0;high=n-1;while (low = high) / low = high表示整个数组尚未查找完mid = (low+high)/2; / 求中间元素的下标midvalue = listmid; / 取出中间元素的值if (key = midvalue) return mid; / 若找到,返回下标else if (key midvalue)high = mid-1; / 若key midvalue将查找范围缩小到数组的前一半elselow = mid+1; / 否则将查找范围缩小到数组的后一半return -1; / 没有找到返回-1第7章 模板例7.7 (续二)#include using namespace std;template int binsearch(t list, int n, t key);void main()int a10 = 2, 3, 7, 12, 16, 35, 67, 68,90, 98;char c11
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026国网上海市电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题有答案详解
- 2026国网河北省电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题附答案详解(预热题)
- 2026秋季国家管网集团华南公司(广东省管网公司)高校毕业生招聘考试参考试题(浓缩500题)及答案详解一套
- 2026秋季国家管网集团浙江省天然气管网有限公司高校毕业生招聘笔试模拟试题(浓缩500题)含答案详解(考试直接用)
- 2026秋季国家管网集团工程技术创新公司(国家管网集团造价管理中心)高校毕业生招聘考试参考试题(浓缩500题)附答案详解(突破训练)
- 2026秋季国家管网集团华中公司高校毕业生招聘笔试备考试题(浓缩500题)及答案详解【必刷】
- 2026国网河南省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(能力提升)
- 2026国网云南省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题含答案详解(预热题)
- 2025国网宁夏电力校园招聘(提前批)笔试模拟试题浓缩500题及答案详解(易错题)
- 2026国网江西省电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题及参考答案详解1套
- 股权转让及法定代表人变更协议书
- EBSCOhost全文数据库简介及使用指南课件
- 病毒性脑炎的护理课件
- 自考专升本《西方文论选读(上册)(云南)》考前知识点汇总
- A01:欧洲标准(中文)-压力表-EN837-1-1998(04-09)
- GB/T 41782.2-2022物联网系统互操作性第2部分:网络连通性
- GB/T 1186-1992压缩空气用橡胶软管(2.5MPa以下)
- GB/T 10061-2008筛板筛孔的标记方法
- 山茶花文化鉴赏课件
- 围手术期间循环紊乱的防治策略课件
- 六年级上册数学课件-3.6 分数连除和乘除混合运算丨苏教版 (共22张PPT)
评论
0/150
提交评论