




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华北电力大学计算机系,10.1模板的概念 10.2函数模板 10.2.1 函数模板说明 10.2.2 使用函数模板 10.2.3 用户定义的参数类型 10.3类模板 10.3.1 类模板说明 10.3.2 使用类模板 10.4模板应用实例,第10章 模版,华北电力大学计算机系,问题引入:,int abs(int x) if(x0) return x; else return x; ,float abs(float x) if(x0) return x; else return x; ,t abs(t x) if(x0) return x; else return x; ,很多情况下,设计的算法可处理多种数据类型,通用代码,华北电力大学计算机系,10.2 函数模板,函数模板可定义一个对任何类型变量操作的通用函数 普通函数vs函数摸板 普通函数只能传递变量参数 函数模板提供了传递类型的机制 步骤 定义函数模板 实例化成相应的模板函数进行调用执行 10.2.1 函数模板说明 10.2.2 使用函数模板 10.2.3 用户定义的参数类型,华北电力大学计算机系,10.2.1 函数模板说明,template (形参表) /函数定义体 template t abs( t x ) if(x 0) return x; return x; 这样的函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码,即模板参数表 class 标志符可以是基本数据类型,也可以是自定义类型。 一个或多个模板参数,每个都要写class,逗号分隔。,中至少出现一次 函数体同一般函数定义一样,华北电力大学计算机系,10.2.2 使用函数模板,1.函数模板只是说明,不能直接执行, 需要实例化为模板函数后才能执行。 template t abs( t x ) if(x 0) return x; return x; 2.当编译系统发现一个函数调用:abs(10); 3.由于10为int型,所以实例化为以下真正的函数: int abs(int x) if(x 0) return -x; return x; 4.再以10为参数调用该函数abs(10);,华北电力大学计算机系,华北电力大学计算机系,【例10.2】,#include template t min(t x,t y) if(xy) return x; else return y; void main() int n1=2, n2=10; double d1=1.5, d2=5.6; cout “较小整数:“ min(n1,n2) endl; cout “较小实数:“ min(d1,d2) endl; ,实例化min模板函数来比较两个双精度数,实例化min模板函数来比较两个整数,本程序的执行结果如下:,华北电力大学计算机系,图10.2 函数模板的实例化,实例化,实例化-当编译器发现有函数调用: (); 根据中的类型,生成一个模板函数 (函数模板的实例),函数模板模板的定义,通用的类型参数 模板函数实实在在的一个函数定义 是由编译系统遇到具体函数调用时生成的 定义体与函数模板的函数定义体,华北电力大学计算机系,注意,函数模板的说明和定义必须是全局作用域。 模板不能被说明为类的成员函数。 函数模板有一个特点,虽然模板参数t可以实例化成各种类型,但是采用模板参数t的各参数之间必须保持完全一致的类型。,华北电力大学计算机系,【例10.3】分析以下程序中的错误。,#include template t min(t x,t y) return (xy) ? y : x; void main() int n=3, n1=4; char c=a, c1=b; double d=2.4, d1=3.4; cout min(n,n1) endl; cout min(c,c1) endl; cout min(d,d1) endl; cout min(n,c) endl; /错误 cout min(n,d) endl; /错误 cout min(c,d) endl; /错误 ,模板类型并不具有隐式的类型转换,华北电力大学计算机系,10.2.3 用户定义的参数类型,问题: 模板和函数的参数可以是基本数据类型,自定义类型? yes 可在函数模板形参表和对模板函数的调用中使用类或其他自定义类型。 【例104】 #include class coord int x,y; public: coord (int x1 , int y1 )x=x1; y=y1; int getx() return x; int gety() return y; ;,华北电力大学计算机系,#include template t ,若标准实例化为基本数据类型,则使用的标准的“”运算符 若函数被实例化为类类型,应对“”运算符进行重载,定义 “”运算符重载,实现重载“”运算符,华北电力大学计算机系,void main() coord c1(5,11), c2(6,18); coord c3 = min(c1,c2); cout “较小的坐标:(“ c3.getx() “,“ c3.gety() “)“ endl; double d1 = 3.25, d2 = 2.54; cout “较小的数:“ min(d1,d2) endl; ,模板函数min中 用重载“”运算符比较coord对象,模板函数min中用标准“”运算符比较double对象,实例化为模板函数 coord double& min(double &o1,double &o2) .,华北电力大学计算机系,10.3 类模板参数化的类,类模板实际上是函数模板的推广。可以用相同的类模板来组建任何类型的对象集合。 例数组类:,class array int *a; int size; public: . ,class array double *a; int size; public: . ,class array t *a; int size; public: . ,华北电力大学计算机系,10.3.1 类模板说明,template 类声明 模板参数表可以为以下内容 class 标志符(指明可以接受一个类型参数) 类型说明符 标志符(指明可以接受一个由类型说明符所规定的常量做为参数) 若包含多项内容,则以逗号分隔。 template class someclass ;,华北电力大学计算机系,【例10.5类模板说明】,template class sample t x; t y; public: sample(t a,t b) x=a; y=b; t getx() return x; t gety(); ; 类模板的成员函数定义 template t sample: gety() return y; ,该类模板sample中除了t为一个类型参数外:其他与普通的类定义完全一样。,这样的一个说明(包括成员函数定义)不是一个实实在在的类,只是对类的描述,称为类模板,它指定类的一个系列(家族)。,华北电力大学计算机系,10.3.2 使用类模板,类模板不能直接使用,必须先实例化为模板类 定义该模板类的对象后才能使用 建立类模板之后,可用下列方式创建类模板的实例: ; 与该类模板中匹配。 类是对象的推广,类模板是类的推广!,华北电力大学计算机系,10.3.2 使用类模板,例:定义一个带常量表达式参数的类模板 template class someclass ; 实例化为模板类 someclass sc; 实例化中所用的实参必须和类模板中定义的形参具有同样顺序和类型,如以下实例化会造成编译错误: someclass sc; 这是因为,类模板中定义的表达式参数int exp1和类型(unsigned int) 500u不匹配。,华北电力大学计算机系,【例10.6使用类模板】,#include template class array int size; t *aptr; public: array(int slots=1) size = slots; aptr = new tslots;/为数组分配内存空间 array() delete aptr; void fill_array(); void disp_array(); ;,t被实例化数组类型代替,类模板的定义,华北电力大学计算机系,template void array:fill_array() cout aptri; template void array:disp_array() for(int i=0;isize;i+) cout aptri “ “; cout endl; ,void main() array ac(5); cout ad(3); cout “填充一个双精度数组:“ endl; ad.fill_array(); cout “数组的内容是:”; ad.disp_array(); ,模板类,模板类的对象,华北电力大学计算机系,华北电力大学计算机系,图10.3 类模板、模板类和对象之间的关系,ac对象,实例化,实例化,实例化,实例化,ad对象,array,华北电力大学计算机系,模板、类、对象和函数之间的关系图,实例化,实例化,实例化,实例化,华北电力大学计算机系,10.4应用实例1【例10.7】对数组插入排序,说明两个函数模板sort和disp,然后分别以整型数组和字符数组为实参进行调用。,#include /1.sort函数模板 template void sort(t a, int n) int i, j; t temp; for(i=1; i0 /for循环结束 ,华北电力大学计算机系,/2.disp函数模板 template void disp(t a, int n) for (int i=0;in;i+) cout ai “ “; cout endl; void main() int a = 3, 8, 2, 6, 7, 1, 4, 9, 5, 0; char b = i, d, a, j, b, f, e, c, g, h; cout “整数排序:“ endl; cout “ 原序列:“; disp(a,10); sort(a,10); cout “新序列: “; disp(a,10); cout “字符排序: “ endl; cout “ 原序列:“; disp(b,10); sort(b,10); cout “ 新序列:“; disp(b, 10); ,华北电力大学计算机系,例10.8通用的栈,可以为整数栈,字符栈,数据成员: 用数组存储栈的元素,栈的数据成员有一个特定类型的数组 栈的上限数组的大小(长度)t smax。 栈顶指针栈顶元素下标值 int top。 栈实现三个操作 push pop stackempty,华北电力大学计算机系,10.4 模板应用实例,#include #include const int max = 20; /栈大小 template class stack t smax; /栈元素数组 int top; /栈顶下标 public: stack() top = -1; /栈顶初始化为-1 void push(const t ,华北电力大学计算机系,template void stack:push(const t ,template int stack:stackempty() const return (top = -1); ,华北电力大学计算机系,void main() /整数栈操作 stack st1; /实例化为模板类 int a = 4, 8, 3, 2 ; cout “整数栈“ endl; cout “ 入栈序列:“; for (int i=0;i4;i+) cout ai “ “; st1.push(ai); cout endl “ 出栈序列:“; while(!st1.stackempty() cout st1.pop() “ “; cout endl;,/字符栈操作 cout st2; char b = a, d, b, c ; cout “ 入栈序列:“; for(i=0; i4; i+) cout bi “ “; st2.push(bi); cout endl “ 出栈序列:“; while (!st2.stackempty() cout st2.pop() “ “; cout endl; /end of main,华北电力大学计算机系,小结,c+程序由类和函数组成,模板也分为: 类模板(class template) 函数模板(function template),华北电力大学计算机系,华北电力大学计算机系,模板、类、对象和函数之间的关系图,实例化,实例化,实例化,实例化,华北电力大学计算机系,函数模板与模板函数的区别是: 函数模板是模板的定义,用的是通用类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年云南法检系统书记员招聘考试(公文写作)综合试题及答案
- 2025年自考专业(学前教育)学前卫生学考试模拟题及答案
- 《养老护理员》模拟练习题及答案
- 平台监管算法优化-洞察与解读
- 2025年(试题)无人机地面站考试题库及答案详解(易错题)
- 绿色化肥技术趋势-洞察与解读
- 2025年澳门特别行政区事业单位教师招聘考试生物学科专业知识试卷及答案
- 2025年事业单位招聘考试旅游类专业综合能力测试试卷真题模拟训练
- 2025年事业单位卫生类预防医学专业知识试卷(真题模拟精析)
- 核心制度考试题及答案问卷星
- 《血管活性药物静脉输注护理》标准解读
- 一道美丽的风景作文500字
- 个人简历模板表格式
- 现网终端问题分析报告
- 第十五章巷道与井筒施工测量
- GB/T 1864-2012颜料和体质颜料通用试验方法颜料颜色的比较
- GB/T 13384-2008机电产品包装通用技术条件
- FZ/T 07019-2021针织印染面料单位产品能源消耗限额
- 《计算机辅助翻译》课程教学大纲
- 电厂化学运行规程
- 新版香港朗文1A-6B全部单词汇总
评论
0/150
提交评论