面向对象程序设计9模板分析报告.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章模板 《面向对象程序设计》 九、模板 内容提要 模板的引入 函数模板和模板函数 类模板与模板类 STL标准模板库的简单应用 提出问题 【例】能否设计一个“通用函数”,该函数能对各种数据类型的数组(基本类型数组或对象数组)进行倒序? 我们首先想到用已学知识----重载来解决该问题 //对整型数组地址begin到end-1的元素倒序 void Reverse int* begin,int* end //首尾元素交换 //然后begin指针增1,end指针减1 for ;begin! endbegin! --end;begin++ int temp; temp *begin; *begin *end; *end temp; //对实型数组地址begin到end-1的元素倒序 void Reverse float* begin,float* end //首尾元素交换 //然后begin指针增1,end指针减1 for ;begin! endbegin! --end;begin++ int temp; temp *begin; *begin *end; *end temp; 函数重载不仅方便用户对函数名的记忆,而且更主要的是完善了同一个函数的代码功能,给调用带来了许多方便。 它允许多个同名的函数存在,但同名的各个函数的形参必须有区别:要从形参的类型、个数或顺序几个方面来区分。 显然,如果需要处理所有数据类型的参数,则需要更多的代码进行函数重载。其冗余增加。 分析问题 从例子代码可以看出,两个重载函数从算法上来看是一样的,整个程序的区别仅仅在于函数所处理数据类型的不同。如果可以将数据类型参数化,那么我们只需要编写一个函数,就可以解决各种数据类型数组的倒序问题,即函数模板。 分析问题 程序设计中,当参与运算的数的不同值会随实际情况而变化时,就使用变量来代替这个数。同理,当处理的数据类型随实际情况变化时,可将数据类型作为可变的部分(参数)从程序中抽取出来。当出现真实的数据类型时,再用具体的数据类型代替; 模板 Template 就是为解决这个问题而产生的; 模板的概念 模板 Template 是对具有相同特性的函数或类的再抽象,模板是一种参数化的多态性工具。 所谓参数化多态性,是指将程序所处理的对象的类型参数化,使一段程序代码可以用于处理多种不同类型的对象。 采用模板编程,可以为各种逻辑功能相同而数据类型不同的程序提供一种代码共享的机制。 模板的概念 模板 Template 使用参数化的C++类型创建相应的函数和类,分为两种类型: -函数模板(Function Template) -类模板(Class Template) 一个模板并非一个实实在在的类或函数,仅仅是一个类或函数的描述,是参数化的函数和类。 模板是一种使用通用类型参数来产生一族函数或类的机制。 模板与实例的关系 函数模板 先看一个例子 template T max T a,T b return a b ?a:b; 参数类型、返回值类型或函数体中使用的类型是通用类型的函数称为函数模板,它定义了一类函数。 函数模板的定义 函数模板的定义格式 template template为声明模板的关键词,声明一个参数化的类或函数集; 类型参数用typename或class关键字指明: template class T1, class T2, class T3 template typename T1, typename T2, typename T3 模板函数的生成 函数模板是对一组函数的描述,它以任意类型T为参数及函数返回值。 它不是一个实实在在的函数,编译系统并不产生任何执行代码。 当编译系统在程序中发现有与函数模板中相匹配的函数调用时,便生成一个重载函数,该重载函数的函数体与函数模板的函数体相同。 //示例函数模板实现对不同数据类型数组进行排序 template void Sort T* begin,T* end T* pi,*pj; for pi end;pi begin;pi-- for pj begin+1;pj pi;pj++ if * pj-1 *pj //采用冒泡法排序 T temp; temp * pj-1 ; * pj-1 *pj; *pj temp; 解决问题 //自定义函数模板,实现对任意类型数组倒序 template void Reverse T* _F,T* _L //_F表示首指针,指向首元素; //_L表示尾指针,指向最后一个元素。 for ; _F ! _L _F ! --_L; ++_F //交换首位两个元素后,_F加1,_L减1

文档评论(0)

武神赵子龙 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档