文本讲义教案cc_第1页
文本讲义教案cc_第2页
文本讲义教案cc_第3页
文本讲义教案cc_第4页
文本讲义教案cc_第5页
免费预览已结束,剩余26页可下载查看

下载本文档

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

文档简介

1、模块12 模板高级语言程序设计基础(C&C+)2主要内容1 模板的概念2 函数模板与模板函数3 类模板与模板类3程序设计中,当参与运算的数的不同值会随实际情况而变化时,就使用变量来代替这个数。同理,当处理的数据类型随实际情况变化时,可将数据类型作为可变的部分(参数)从程序中抽取出来。等出现真实的数据类型时,再用具体的数据类型代替;模板就是为解决这个问题而产生的。模板的引入模板是一种基于类型参数生成函数和类的机制,模板将函数或类中的数据类型作为参数,也称为“参数化的类型”;模板使用户可将功能相似、仅数据类型不同的函数或类设计为通用的函数模板或类模板,使函数或类适用于多种数据类型的情况;模板可分为

2、函数模板和类模板;1 模板的概念函数模板或类模板不是一个实在的函数或类,只有经过参数实例化,才变为一个具体的函数或类;参数实例化即给函数模板或类模板带入具体的类型参数;经过类型参数实例化的函数模板或类模板称为模板函数或模板类;同一个类模板参数实例化后可生成很多仅数据类型不同的模板类,可以定义每个模板类的对象。1 模板的概念6函数模板类模板模板函数模板类对象对象模板参数实例化参数实例化模板与实例的关系模板的概念7模板声明格式: template 模板定义体template为声明模板的关键词,声明一个参数化的类或函数集;“模板参数表”表示一个或多个模板参数,每个模板参数由关键字class和模板形参

3、两部分组成,多个模板形参之间以“,”分割;模板定义体是该模板的作用体,可以是函数或类的定义。 模板的声明模板的概念8函数模板和模板函数重载模板函数2 函数模板与模板函数9请先看交换两个数据的函数例子:1、交换两个整数void swap(int &n1, int &n2) int temp; temp=n1; n1=n2; n2=temp;2、交换两个长整型数void swap(ling &n1, long &n2) long temp; temp=n1; n1=n2; n2=temp; 2 函数模板和模板函数10上述swap函数是重载函数,它们的参数个数相同,实现算法相同,仅参数类型不同;重载

4、时需要分别定义不同参数类型的版本;能否为上述的重载函数编写一个通用的算法的函数,使其使用多种数据类型? 2 函数模板和模板函数11函数模板给出了解决问题的办法:将数据类型抽取出来作为函数参数;函数模板是一个通用函数,其函数类型和参数类型不具体指定,用一个“通用的”类型来代替;凡是函数体相同的函数都可以用此模板代替,不必定义多个函数。 2 函数模板和模板函数调用函数模板时,系统根据传递来的实参类型取代模板中的通用类型,实现不同的函数功能;函数模板是对通用函数的描述,不是一个实在的函数,编译系统不会为其产生任何代码; 函数模板的定义函数模板将函数要处理的某种特定的数据类型说明为参数,表示它能对通用

5、的数据类型进行处理。template 返回类型 函数名(参数表) /函数定义体 ; 函数模板的定义14函数模板中,template是关键字。模板参数是函数模板的参数化的数据类型,例如:template void swap(T &n1, T &n2) T temp; temp=n1; n1=n2; n2=temp; 函数模板使用注意-115函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行;若编译系统发现以下调用:函数名(实参表),则用数据的实际类型代替参数表中的通用类型,并生成与函数模板定义的函数体相同的一个重载函数,即模板函数; 函数模板使用注意-116例如执行 “int a,

6、b; swap(a,b);”后,将使类型形参T被实例化为整型int,同时产生如下的重载函数:void swap(int &n1, int &n2) int temp; temp=n1; n1=n2; n2=temp; 例1 函数模板应用举例。函数模板使用注意-217在函数模板被实例化以前,必须先对函数模板进行声明。例2 求2个数中的最小数。函数模板使用注意-318虽然函数模板中的模板形参T可以被实例化为各种类型,但实例化T的各个模板实参之间必须保持完全一致的类型,否则会出错。例3 求2个或3个数中的最大数。 模板函数191. 寻找一个参数完全匹配的函数,如果找到了就调用它;2. 失败后,寻找一

7、个函数模板,使其实例化,产生一个匹配的模板函数,若找到了,就调用它; 函数模板与同名的非模板函数重载时,函数调用遵循以下约定:函数调用的一般规则:203. 若1、2都失败了,再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等,若找到了,就调用它。4. 如果1、2、3都未找到匹配的函数,则是一个错误的调用。函数调用的一般规则:21函数模板和模板函数的区别:函数模板不是函数,定义中使用的是通用类型的参数,编译系统不为其产生运行代码;函数模板只是定义了对数据的加工逻辑,并没有确定真正的数据类型,也就无法生成实际的执行代码;22函数模板和模板函数的区别:模板函数是函数模板被调用时根据参

8、数类型生成的实际函数,包含最终的执行代码;模板函数中使用的数据类型都是实际类型;模板函数出现在函数调用执行过程中,一般不能显式地看到。4 类模板与模板类一个类模板允许用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数或某些成员函数的返回值,能取任意类型;4 类模板与模板类如果一个类中数据成员的类型不能确定,或者某个成员函数的参数或返回值类型不能确定,就必须将此类声明为模板;类模板的存在不是代表一个具体的、实际的类,而是代表着“一类”类。 类模板的定义定义一个类模板:template /声明一个模板class 类名 /类模板体定义;其中与函数模板中的意义相同;类成员的声明方法同普通

9、类的定义,只是各个成员(数据和函数)通常要用到模板的通用类型参数。例:template class database T *data; int size; public: database (int); T & operator (int); ; 类模板的定义定义类的成员函数:在类模板定义体外定义类模板的成员函数时,需在函数体外进行模板声明:Template 类名:成员函数名(参数表) /成员函数定义体其中类型名表是类型形参的列表; 例 声明一个类模板template class Examplepublic: T1 getx( ) return x; T2 gety( ) return y; private: T1 x; T2 y; ;类模板Example中T1、T2为类型参数;类模板不能直接使用,必须先实例化为具体的类,才能用来定义对象。 类模板的使用类模板的使用实际上是将类模板实例化成一个具体的类-模板类,它的格式为: 对象表;其中应与该模板中的匹配,模板类是类模板实例化后的产物,如下图所示: 类模板Example模板类Example模板类Example模板类Exam

温馨提示

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

评论

0/150

提交评论