C++程序设计 9章 模板.ppt

大学C++程序设计教程-杨国兴及例题-课件PPT

收藏

资源目录
跳过导航链接。
大学C程序设计教程-杨国兴及例题-课件PPT.zip
C++程序设计教程-杨国兴及例题-PPT演示文稿
C++程序设计教程-杨国兴及例题-PPT课件文件
C++程序设计教程-杨国兴及例题-大学教学资料
(课件资料)《C++程序设计教程》-杨国兴-电子教案及例题
压缩包内文档预览:(预览前20页/共24页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:21836152    类型:共享资源    大小:1.57MB    格式:ZIP    上传时间:2019-09-06 上传人:QQ24****1780 IP属地:浙江
25
积分
关 键 词:
大学 C++ 程序设计 教程 杨国兴 例题 课件 ppt
资源描述:
大学C++程序设计教程-杨国兴及例题-课件PPT,大学,C++,程序设计,教程,杨国兴,例题,课件,ppt
内容简介:
第9章 多态性,9.1 函数模板 9.2 模板函数的覆盖 9.3 类模板,9.1 函数模板,1. 问题的提出 重载函数可以解决功能相同或相似的函数使用同一个函数名的问题。 void swap(char ,第9章 模板,void swap(float ,实际代码量并未减少。可使用函数模板减少大量代码。,9.1 函数模板,2. 函数模板的定义 template 或 类型名 函数名(参数表) 函数体 函数模板就像是一个带有类型参数的函数(参数T即为类型),编译程序会根据实际参数的类型确定参数的类型。,第9章 模板,template 类型名 函数名(参数表) 函数体 ,例9.1 定义用于变量交换的函数模板,#include template void swap(T ,第9章 模板,程序运行结果为: B, A 456, 123 45.6, 12.3,例9.2 插入排序函数模板,使用插入排序函数模板可以为不同数据类型的数组排序,如整型、字符型、实型等等,为了使程序具有通用性,设计函数模板InsertionSort()。,插入排序的基本思想:每一步将一个待排序的元素按其关键字值的大小插入到已排序序列的合适位置,直到待排序元素全部插入完为止。,第9章 模板,例9.2 (续一),template void InsertionSort(T A, int n) int i, j; T temp; for (i = 1; i 0 ,第9章 模板,例9.2 (续二),#include 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.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; ,第9章 模板,程序运行结果为: 0 1 2 3 4 5 6 7 8 9 2.7 4.6 5.9 12.1 15.5 24.2 25.6 33.3 40.3 81.7,例9.3 使用函数模板产生的二意性,#include template T max(T a, T b) return ab?a:b; void main(void) int a = max(10.5, 20); double b = max(10, 20.6); cout a endl; cout b endl; ,第9章 模板,9.2 模板函数的覆盖,下列函数模板: template T max(T a, T b) retum ab?a:b; 对于简单的数据类型,如整型、实型、字符型数据,这个模板能够正常工作。对于字符串,用上述模板就会出现问题,因为对于字符串,不能使用运算符“”,要为其编写独立的max()函数。 我们将函数模板生成的函数称为模板函数。如果某一函数的函数原型与函数模板生成的函数(模板函数)原型一致,称该函数为模板函数的覆盖函数。,第9章 模板,例9.4 模板函数的覆盖,#include #include template T max(T a, T b) return ab?a:b; char *max(char *x, char *y) return strcmp(x, 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; ,第9章 模板,程序运行结果为: EFGH 20 20.6,9.2 模板函数的覆盖,在进行函数调用时,编译程序采用如下策略确定调用哪个函数: (1)首先寻找一个实参与形参完全匹配的覆盖函数,如果找到,则调用该函数 (2)如果能通过函数模板生成实例函数,并且参数匹配,则调用该函数。 (3)通过强制类型转换,寻找能够与实参匹白的覆盖函数,或通过函数模板生成的实例函数、如果找到则调用该函数。 (4)如果所有努力失败,则给出出错信息。,第9章 模板,9.3 类模板,1. 问题的提出 class A int i; public: A(int a) void set (int b) ; class B double i; public: B(double a) void set (double b) ;,第9章 模板,这两个类的方法都一样,只是一个数据类型是整型,另一个数据类型是实型。可以使用类模板简化代码,类模板也称为参数化的类,用于为类型相似的类定义一种通用模式,9.3 类模板,2. 类模板的定义 template class 类模板名 成员声明 如果需要在类模板外定义类模板的成员函数,格式如下: template 类型 类模板名:函数名(参数表) 函数体 ,第9章 模板,9.3 类模板,2. 类模板的定义(续) 使用类模板建立对象的语法如下: 类模板 对象1,对象2,; 系统会根据实参的类型,生成一个类(称为模板类),然后建立该类的对象。即对模板实例化生成类,再对类实例化生成对象。,第9章 模板,例9.5 定义数组类的类模板,并利用成员函数对数组中的元素初始化。,#include template class myArray public: myArray(int nSize,T Initial); myArray() delete m_pArray; T ,第9章 模板,例9.5 (续一),template myArray:myArray(int nSize,T InitVal) m_nSize=(nSize1)? nSize:1; m_pArray=new Tm_nSize; for(int i=0;i void myArray:Show(int nNumElems, char *pszMsg, bool bOneLine) cout pszMsgendl; if(bOneLine) for(int i=0;inNumElems;i+) cout m_pArrayi ; cout endl; else for(int i=0;inNumElems;i+) cout m_pArrayiendl; ,第9章 模板,构造函数为m_nSize赋值,并为数组申请存储空间,将数组的每个元素都赋值为InitVal。,成员函数Show()显示数组元素的值,元素的个数由第一个参数指定,第二个参数为输出数组元素值之前,输出的提示信息,第三个参数确定数组元素是显示在一行上,还是多行。,例9.5 (续二),template void myArray:Sort(int nNumElems) int i, j; T temp; for (i = 1; i 0 ,第9章 模板,成员函数Sort()使用插入排序法对数组元素排序(升序),其参数是数组中元素的个数。,例9.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, ); 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; ,第9章 模板,程序运行结果为: Unsorted array is: 89 34 32 47 15 81 78 36 63 83 Sorted array is: 15 32 34 36 47 63 78 81 83 89 Unsorted array is: C W r Y k J X Z y s Sorted array is: C J W X Y Z k r s y,例9.6 使用缺省参数定义数组的类模板,#include template class Array T *data; int size; public: Array(int); Array(); T ,第9章 模板,template Array :Array(int n) data = new Tsize=n; template Array :Array() delete data; template T ,注意:函数模板不能定义缺省参数,而类模板却可以定义缺省参数。,例9.6 (续),void main(void) int i; Array L1(10); /等价于Array L1(10) Array 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; ,第9章 模板,程序运行结果为: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T,例9.7 折半查找函数模板,第9章 模板,基本思想:对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。比如在如下数组中查找值为48的元素:,例9.7 (续一),template int BinSearch(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将查找范围缩小到数组的前一半 else low = mid+1; / 否则将查找范围缩小到数组的后一半 return -1; / 没有找到返回-1 ,第9章 模板,例9.7 (续二),#include template int BinSearch(T list, int n, T key); void main() int a10 =
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:大学C++程序设计教程-杨国兴及例题-课件PPT
链接地址:https://www.renrendoc.com/p-21836152.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!