清华C++语言程序设计:第18章 模板.ppt_第1页
清华C++语言程序设计:第18章 模板.ppt_第2页
清华C++语言程序设计:第18章 模板.ppt_第3页
清华C++语言程序设计:第18章 模板.ppt_第4页
清华C++语言程序设计:第18章 模板.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

2019/4/16,1,第18章 模板,2019/4/16,2,讲授内容,类属机制 函数模板的定义与使用 类模板的定义与使用,2019/4/16,3,18.1 类属机制(1/2),从逻辑功能来看,有些程序非常相似,不同之处只是处理对象(数据)的类型 例6_4 中的程序 void sortArray( int b, int len); void sortArray( double b, int len); 可以考虑提供具有相同逻辑功能的程序,而将数据类型作为参数类属编程 C+中的模板:类模板和函数模板,2019/4/16,4,18.1 类属机制(2/2),更好的代码重用性 重用源代码 用户使用模板时,编译器替换模板参数(类型) 模板可以包含类型参数也可以包含非类型参数,2019/4/16,5,18.2 函数模板(1/5),对不同类型的数据执行相似的操作 函数重载 函数模板 函数重载代码冗余 增加编程负担 程序的维护问题(如功能修改),2019/4/16,6,18.2 函数模板(2/5),函数模板为所有的函数提供唯一的一段函数代码 置换代码中的类型参数得到模板函数实例化 函数模板不是函数,不能被执行 实例化后的模板函数是真正的函数,可以被执行,2019/4/16,7,18.2 函数模板(3/5),函数模板的定义都是以关键字template开头 template之后中是函数模板的参数列表 函数模板的参数是类型参数,其类型为class或typename template template 模板的参数定义之后是函数模板的定义,是一个将类型参数作为某种类型使用的函数,2019/4/16,8,18.2 函数模板(4/5),函数模板的参数名在模板中作为一种类型使用 模板的每个形式参数要在函数的参数列表中至少出现一次 形式参数名的作用域局限于函数模板的范围内,2019/4/16,9,例子1:函数模板例子,template void sortArray(ElementType b, int len) for (int pass = 0; pass b i ) ElementType hold; hold = b pass ; b pass = b i ; b i = hold; ,2019/4/16,10,18.2 函数模板(5/5),函数模板规定了对数据的处理流程 某些数据类型(模板的参数)要等到模板实例化时再确定具体的类型 函数模板的实例化由编译器来完成 根据函数调用的实参类型确定模板形参的具体类型 用相应的类型替换函数模板中的模板参数完成函数模板的实例化 为什么模板的每个形参要在函数的参数列表中至少出现一次?,2019/4/16,11,例子2:使用函数模板实现数组的排序和输出(1/4),/ex18_1:使用函数模板实现数组的排序和输出 #include #define SIZE 8 template void sortArray(ElementType b, int len) for (int pass=0; pass bi) ElementType hold; hold = b pass ; b pass = b i ; b i = hold; ,2019/4/16,12,例子2:使用函数模板实现数组的排序和输出(2/4),template void displayArray(ElementType b, int len) for(int index=0; index = len-1; index+) if ( index != len -1 ) cout b index “t“; else cout b index endl; ,2019/4/16,13,例子2:使用函数模板实现数组的排序和输出(3/4),int main() int aiSIZE = 18,35,36,61,9,112,77,12; double afSIZE = 12.1, -23.8, 3.7, -16.0, 9.1, 12.12, 7.7, 56.3; cout “Before sorting:n“; cout “ai: t“; displayArray(ai, SIZE); sortArray(ai, SIZE); cout “After sorting:n“; cout “ai: t“; displayArray(ai, SIZE);,2019/4/16,14,例子2:使用函数模板实现数组的排序和输出(4/4),cout “Before sorting:n“; cout “af: t“; displayArray(af, SIZE); sortArray(af, SIZE); cout “After sorting:n“; cout “af: t“; displayArray(af, SIZE); return 0; ,2019/4/16,15,程序运行结果,Before sorting: ai: 18 35 36 61 9 112 77 12 After sorting: ai: 9 12 18 35 36 61 77 112 Before sorting: af: 12.1 -23.8 3.7 -16 9.1 12.12 7.7 56.3 After sorting: af: -23.8 -16 3.7 7.7 9.1 12.1 12.12 56.3,2019/4/16,16,18.3 类模板,类模板:将类定义中的数据类型参数化 类模板的实例化:用具体的数据类型替换模板的参数以得到具体的类(模板类) 模板类也可以实例化为对象,2019/4/16,17,例子2:用类模板实现栈(1/6),/ tstack.h: 类模板的定义 template class Stack public: Stack( int = 8 ); / 省缺栈元素的树数目为8 Stack() delete data; ; int pop(ElementType ,2019/4/16,18,例子2:用类模板实现栈(2/6),/ tstack.h: 类模板的定义(续) template Stack:Stack(int s) size = s 0 ? s : 8; data = new ElementTypes; memNum = 0; template int Stack:pop(ElementType ,2019/4/16,19,例子2:用类模板实现栈(3/6),/ tstack.h: 类模板的定义(续) template int Stack:push(ElementType mem) if (memNum = size) return 0; data memNum + = mem; return 1; ,2019/4/16,20,例子2:用类模板实现栈(4/6),/ex18_2.cpp:使用栈 #include #include “tstack.h“ int main() Stack doubleStack(6); double f = 3.14; cout“Pushing elements into doubleStack:n“; while (doubleStack.push(f) cout f ; f += f; cout “nStack is full. Cannot push “ f “ onto the doubleStack.“;,2019/4/16,21,例子2:用类模板实现栈(5/6),cout intStack; int i = 1; cout“nPushing elements into intStack:n“; while (intStack.push(i) cout i ; +i; cout“nStack is full.push “ i“failed.“;,2019/4/16,22,例子2:用类模板实现栈(6/6),cout“nnPopping elements from intStack:n“; while (intStack.pop(i) cout i ; cout “nStack is empty. Cannot pop.n“; return 0; ,2019/4/16,23,程序执行结果,Pushing elements onto doubleStack: 3.14 6.28 12.56 25.12 50.24 100.48 Stack is full. push 200.96 failed. Popping elements from doubleStack: 100.48 50.24 25.12 12.56 6.28 3.14 Stack is empty. Cannot pop. Pushing elements onto intStack: 1 2 3 4 5 6 7

温馨提示

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

评论

0/150

提交评论