南开大学C++课件第9章模板及其应用.ppt

上传人:自*** 文档编号:126729658 上传时间:2020-03-27 格式:PPT 页数:49 大小:1.05MB
返回 下载 相关 举报
南开大学C++课件第9章模板及其应用.ppt_第1页
第1页 / 共49页
南开大学C++课件第9章模板及其应用.ppt_第2页
第2页 / 共49页
南开大学C++课件第9章模板及其应用.ppt_第3页
第3页 / 共49页
南开大学C++课件第9章模板及其应用.ppt_第4页
第4页 / 共49页
南开大学C++课件第9章模板及其应用.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《南开大学C++课件第9章模板及其应用.ppt》由会员分享,可在线阅读,更多相关《南开大学C++课件第9章模板及其应用.ppt(49页珍藏版)》请在金锄头文库上搜索。

1、1 第9章模板及其应用 9 1函数模板9 2类模板9 3关于类模板若干问题的说明9 4程序实例本章介绍函数模板与类模板的定义及其使用方法 通过使用模板 可使所编程序更加紧凑 增加程序的通用性及可重用性 2 9 1函数模板9 1 1函数模板的概念及说明9 1 2函数模板的应用举例 9 1 1函数模板的概念及说明 参看书p299 301通常设计的算法 处理语句 是可以处理多种数据类型的 但目前处理相同的问题 仍要分别定义多个类似的函数 3 intmax inta intb if a b returna elsereturnb doublemax doublea doubleb if a b ret

2、urna elsereturnb charmax chara charb 4 实际上 若 提取 出一个可变化的类型参数T 则可 综合 成为如下的同一个函数 模板 它实际上代表着一组函数 Tmax Ta Tb if a b returna elsereturnb 在C 中定义完整的函数模板max时 格式如下 templateTmax Ta Tb if a b returna elsereturnb 5 函数模板定义的一般格式为 template返回类型函数模板名 形参表 函数体 注意 1 应在 返回类型 或 形参表 或 函数体 中使用上述的 类型形参名 2 调用处则类似于一般函数 用户只需给出具

3、体的实参 3 模板函数调用时 不进行实参到形参类型的自动转换 6 9 1 2函数模板的应用举例 参看书p302 1 函数模板例1定义一个函数模板max 而后对它进行不同的调用 includetemplateTmax Ta Tb if a b returna elsereturnb 7 voidmain inti1 11 i2 0 doubled1 d2 cout d1 d2 cout max d1 d2 endl cout max 23 5 6 max 23 5 6 endl 出错 不进行实参到形参类型的自动转换 8 程序执行后的显示结果如下 inti1 11 i2 0 max i1 i2 0

4、max 23 56 23charc1 T c2 F max c1 c2 Tmax f k kinputdoubled1 d2 123 4599 67d1 123 45 d2 99 67 max d1 d2 123 452 函数模板例2 函数模板与函数重载定义一个函数模板与一个函数 它们都叫做min C 允许这种函数模板与函数同名的所谓重载使用方法 但注意 在这种情况下 每当遇见函数调用时 C 编译器都将首先检查是否存在重载函数 若匹配成功则调用该函数 否则再去匹配函数模板 9 include includetemplatetypemin typea typeb type型的a与b要能够进行 比

5、较运算 return a b a b char min char a char b 函数min 字符串型参数 不能直接使用 来进行比较return strcmp a b 0 a b voidmain cout min 3 10 endl 使用函数模板cout min 2 5 99 5 endl cout min m c endl char str1 TheCprogram str2 TheC program cout min str1 str2 endl 使用重载函数 10 3 函数模板例3 二函数模板重载定义两个函数模板 它们都叫做sum 都使用了一个类型参数Type 但两者的形参个数不同

6、C 允许使用这种函数模板重载的方法 注意 参数表中允许出现与类型形参Type无关的其它类型的参数 如 intsize includetemplateTypesum Type array intsize 求array数组前size个元素之和Typetotal 0 for inti 0 i size i total array i returntotal 11 templateTypesum Type a1 Type a2 intsize 求a1数组与a2数组前size个元素之和Typetotal 0 for inti 0 i size i total a1 i a2 i returntotal

7、voidmain inta1 10 a2 8 floataf 10 为数组分量定值cout sum a1 10 endl 求出a1数组前10个元素之和并输出cout sum af 10 endl cout sum a1 a2 8 endl 求a1与a2数组前8个元素之和并输出 12 9 2类模板9 2 1一个队列类模板9 2 2类模板说明9 2 3使用类型参数和普通参数的类模板 13 9 3 1设计一个队列类模板 参看书p305 队列与栈不同 对数据采用 先进先出 FIFO的管理方式 而栈则使用 先进后出 FILO方式 队列数据放于作为类成员的动态数组queue之中 在构造函数中 将通过new

8、来生成该动态数组 动态数组queue的大小由类的私有数据成员Maxsize之值来确定 但注意 此示例并没有循环使用上述的动态数组queue空间 即是说 队列中至多可以存放Maxsize个数据项 即使取走若干项后有了空闲空间后也不可重新进行使用 若稍加改造 使存取数据时首先通过对下标进行模Maxsize的运算 则可实现循环使用动态数组queue空间的功能 我们把它留作一个练习 14 include includetemplateclassQueue intMaxsize 队列的大小intfront rear 元素放在queue front 1 到queue rear 之中keytype queu

9、e 动态数组queue 用来存放队列数据public Queue intsize 构造函数 生成动态数组来存放队列数据Maxsize size queue newkeytype Maxsize front rear 1 意味着队列为空 15 intIsFull if rear Maxsize 1 return1 elsereturn0 intIsEmpty if front rear return1 elsereturn0 voidAdd constkeytype 16 Delete在类体外定义 函数名前要加类限定符 Queue templatekeytypeQueue Delete void

10、 if IsEmpty coutvoidQueue Add constkeytype 17 voidmain inti 0 QueueQi 10 QueueQf1 10 Qf2 10 while Qi IsFull Qi中只能盛10个数Qi Add 2 i Qi中 0 2 4 6 8 10 12 14 16 18Qf1 Add 3 0 i Qf1中 3 6 9 12 15 18 21 24 27 30 for i 0 i 4 i 四次循环 每次总 先往Qf2的队列尾部加入两个数 而后又从首部删取一个数并输出Qf2 Add 4 5 Qi Delete 从Qi首删取一元素 乘以4 5 而后将其加入

11、到Qf2尾部 四次循环往Qf2队列尾加入 0 4 5 2 4 5 4 4 5 6 4 5 程序执行后的显示结果如下 01 593 18 9 2 2类模板说明利用类模板 带类型参数或普通参数的类 一次就可定义出具有共性的一组类 即 可使得所定义类中的某些数据成员 某些成员函数的参数 某些成员函数的返回值都可以是任意类型的 19 类模板定义格式如下 templateclass类模板名 带上述类型形参或普通形参名的类定义体 说明类型形参时 使用 class类型形参名 的方式 说明普通形参时 使用 普通形参名 的方式 注意 1 类定义体中应使用上述的 类型形参名 及 普通形参名 2 利用类模板说明类对

12、象时 要随类模板名同时给出对应于类型形参或普通形参的具体实参 从而实例化为一个具体的类 说明格式为 类模板名注意 类型形参的相应实参为类型名 而普通形参的相应实参必须为一个常量 20 3 类模板的成员函数既可以在类体内进行说明 自动按内联函数处理 也可以在类体外进行说明 在类体外说明 定义 时使用如下格式 template返回类型类模板名 函数名 形参表 函数体 上述的 形参1的名字 来自于 形参1的说明 由 甩掉 说明部分的 类型 而得 是对类型形参或普通形参的使用 而 类模板名 所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符 21 例如 对具有一个类型参数T的类模板TestC

13、lass 在类体外定义其成员函数getData时的大致样式如下 templateTTestClass getData 形参表 函数体 其中的 TestClass 所起的作用正是在类体外定义成员函数时在函数名前所加的类限定符 22 9 2 3使用类型参数和普通参数的类模板 1仅使用类型参数的类模板 includetemplateclassTestClass public Tbuffer 10 T类型的数据成员buffer数组大小固定为10 灵活性差 TgetData intj 获取T类型buffer 数组 的第j个分量 templateTTestClass getData intj return

14、 buffer j 23 voidmain TestClassClassInstA char取代T 从而实例化为一个具体的类charcArr 6 abcde for inti 0 i 5 i ClassInstA buffer i cArr i for i 0 i 5 i charres ClassInstA getData i cout res cout endl 24 TestClassClassInstF 实例化为另外一个具体的类doublefArr 6 12 1 23 2 34 3 45 4 56 5 67 6 for i 0 i 6 i ClassInstF buffer i fAr

15、r i 10 for i 0 i 6 i doubleres ClassInstF getData i cout res cout endl 程序执行后的显示结果如下 abcde2 113 224 335 446 557 6 25 2仅使用普通参数 非类型参数 的类模板示例 includetemplateclassTestClass public intbuffer i 使buffer的大小可变化 但其类型则固定为int 灵活性差 intgetData intj templateintTestClass getData intj return buffer j 26 voidmain Test

16、ClassClassInstF doublefArr 6 12 1 23 2 34 3 45 4 56 5 67 6 for i 0 i 6 i ClassInstF buffer i fArr i 10 for i 0 i 6 i doubleres ClassInstF getData i cout res cout endl 程序执行后的显示结果如下 21324354657 27 3既使用类型参数又使用普通参数的类模板示例 include include string h templateclassTestClass public Tbuffer i T类型的buffer 其大小随普通形参i的值变化 灵活性大 TgetData intj templateTTestClass getData intj return buffer j 28 voidmain TestClassClassInstA charcArr 6 abcde strcpy ClassInstA buffer cArr for inti 0 i 5 i charres ClassInstA getData i c

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号