版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+面向对象程序设计第七章本章导读 模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而现了真正的代码重用。模板分为函数模板和类模板,它们分别允许用户构造模板函数和模板类。本章要点 函数模板 类模板第七章 目录 7.1 模板的概念 7.2 函数模板与模板函数 7.3 模板函数的覆盖 7.4 类模板与模板类 7.5 程序举例 7.6 本章小结 习题七7.1 模板的概念 模板分为函数模板和类模板,它们分别允许用户构造模板函数和模板类。模板、模板函数、模板类和对象之间的关系如图7-1所示:模板(函数模板与类模板)模板(函数模板与类模板)模板函数模板函数模板类模板类对象对象
2、图7-1 7.2 函数模板与模板函数 函数模板的一般说明形式如下: template 返回类型 函数名(模板形参表) 函数体 其中,template是一个声明模板的关键字,它表示声明一个模板。 例如,将求最大值函数swap ()定义成函数模板,如下所示: template void swap(T &x, T &y) T temp=x; x=y; y=temp; 也可以定义成如下形式 template void swap(T &x, T &y) T temp=x; x=y; y=temp; 其中,T为类型参数,它既可取系统预定义的数据类型,又可以取用户自定义的类型
3、。 上面定义的函数代表的是一类函数,若要使用这个函数进行求最大值操作,必须先将T实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数。用模板实参实例化的函数称为模板函数。 当编译系统发现有一个函数调用 函数名(模板实参表); 时,将根据模板实参表中的类型生成一个函数即模板函数。该模板函数的函数体与函数 模板的函数定义体相同。 【例7.2】定义用于变量交换的函数模板。 #include using namespace std; template void swp(T &x, T &y) T temp=x; x=y; y=temp; int main() char a=A,
4、 b=B; int c=123, d=456; double e=12.3, f=45.6; swp(a,b); swp(c,d); swp(e,f); cout 交换后: a , b endl; cout 交换后: c , d endl; cout 交换后: e , f endl; system(pause); return 0; 程序运行结果: B,A 456, 123 45.6, 12.3 函数模板就像是一个带有类型参数的函数,编译程序会根据实际参数的类型确定参 数的类型。7.3 模板函数的覆盖 下列函数模板: template T max(T a, T b) retum ab?a:b;
5、 对于简单的数据类型,如整型、实型、字符型数据,这个模板能够正常工作。 对于字符串,用上述模板就会出现问题,因为对于字符串,不能使用运算符“”,要为其编写独立的max()函数。 我们将函数模板生成的函数称为模板函数。如果某一函数的函数原型与函数模板生成的函数(模板函数)原型一致,称该函数为模板函数的覆盖函数。 【例7.3】 模板函数的覆盖 #include #include using namespace std; template T max1(T a, T b) return ab?a:b; char *max1(char *x, char *y) return strcmp(x, y)
6、0 ? x :y;void main() char *p=ABCD, *q=EFGH; p=max1(p, q); int a =max1(10, 20); float b =max1(12.3, 45.6); cout p endl; cout a endl; cout b endl; system(pause); 在进行函数调用时,编译程序采用如下策略确定调用哪个函数: ()首先寻找一个实参与形参完全匹配的覆盖函数,如果找到,则调用该函数。 ()如果能通过函数模板生成实例函数,并且参数匹配,则调用该函数。 ()通过强制类型转换,寻找能够与实参匹白的覆盖函数,或通过函数模板生成的实 例函数、
7、如果找到则调用该函数。 ()如果所有努力失败,则给出出错信息。7.4 类模板与模板类 类模板允许用户为类定义一种模式,使得类中的某些数据成员,某些成员函数的参数或返回值,能取任意数据类型。 定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,然后是类名,其格式如下: template class 类名 / ; 类模板不是代表一个具体的、实际的类,而是代表着一类类。实际上,类模板的使用就是将类模板实例化成一个具体的类,它的格式为: 类名 对象名; 【例7.4】使用栈类模板的使用。 #include using namespace std; const int size=10
8、; template /声明一个类模板class stack public: void init() tos=0; void push(Type ch); /参数取Type类型 Type pop(); /返回类型取Type类型 private: Type stcksize; /数组的类型为类型参数Type,即可取任意类型 int tos; ;template void stack:push(Type ob) if (tos=size) cout“stack is full”; return ; stcktos=ob; tos+; template Type stack :pop() if (t
9、os=0) cout“stack is empty”; return 0; tos-; return stcktos;int main() /定义字符堆栈stack s1,s2; /创建两个模板参数为char型的对象int i;s1.init(); s2.init();s1.push(a); s2.push(x);s1.push(b); s2.push(y);s1.push(c); s2.push(z);for(i=0;i3;i+) cout“pop s1: “s1.pop()endl;for(i=0;i3;i+) cout“pop s2: “s2.pop()endl;/定义整型堆栈stack
10、 is1,is2; /创建两个模板参数为int型的对象is1.init(); is2.init();is1.push(1); is2.push(2);is1.push(3); is2.push(4);is1.push(5); is2.push(6);for (i=0;i3;i+) cout“pop is1: “is1.pop()endl;for (i=0;i3;i+) cout“pop is2: “is2.pop()endl;system(“pause”);return 0;程序运行结果:pop s1: cpop s1: bpop s1: apop s2: zpop s2: ypop s2:
11、xpop is1: 5pop is1: 3pop is1: 1pop is2: 6pop is2: 4pop is2: 27.5 程序举例【实例2】使用缺省参数定义数组的类模板#includeusing namespace std;template class Array T *data; int size;public: Array(int); Array(); T &operator(int);template Array :Array(int n) data = new Tsize=n;template Array :Array() delete data;template T
12、&Array :operator(int i) return datai;void main() int i; Array L1(10); /等价于Array L1(10) Array L2(26); for(i=0; i10; i+) L1i = i; for(i=0; i26; i+) L2i = A+i; for(i=0; i10; i+) cout L1i ; cout endl; for(i=0; i26; i+) cout L2i ; cout endl; system(“pause”);程序运行结果:0 1 2 3 4 5 6 7 8 9A B C D E F G H I
13、 J K L M N O P Q R S T U V W X Y Z7.6 本章小结 ()模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而现了真正的代码重用。 ()模板分为函数模板和类模板,它们分别允许用户构造模板函数和模板类。 ()我们将函数模板生成的函数称为模板函数。如果某一函数的函数原型与函数模板生成的函数(模板函数)原型一致,称该函数为模板函数的覆盖函数。习题七 一、填空题 1定义一个函数模板要用到的第一个修饰符是_。 2在函数模板的参数中,用class修饰的参数称为_参数。 3函数模板生成的函数称为 。如果某一函数的函数原型与函数模板生成的函数(模板函
14、数)原型一致,称该函数为模板函数的。 4模板分为和。 5. 模板是实现的一种工具,它可以实现。 二、选择题 C+程序的基本模块为( )。 A表达式 B标识符 C语句 D函数 以下关于函数模板叙述正确的是( )。 A函数模板也是一个具体类型的函数 B函数模板的类型参数与函数的参数是同一个概念 C通过使用不同的类型参数,函数模板可以生成不同类型的函数 D用函数模板定义的函数没有类型 类模板template class X,其中,友元函数f对特定类型T(如int),使函数f(X&)成为X(int)模板类的友元,则其说明为( )。 Afriend void f(); Bfriend void f(X&); Cfriend void A:f(); Dfriend void C:f(X&);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冷拨钢筋项目可行性研究报告
- 临床路径管理规范
- 买平房合同范本
- 2025年度特种货物运输合同
- 专利许可合同范例 baidu
- 2025年度影视制作剧务助理场记聘用合同范本-@-1
- 制作装备柜合同范例
- 2025年度跨境电子商务合作合同范本
- 工商管理复习测试卷附答案
- 企业合作生产合同范本
- 医美注射类知识培训课件
- 2025年广电网络公司工作计划(3篇)
- 货运车辆驾驶员服务标准化培训考核试卷
- 银行行长2024年个人年终总结
- 财务BP经营分析报告
- 设备基础预埋件施工方案
- 中华人民共和国保守国家秘密法实施条例培训课件
- 2024年全国统一高考英语试卷(新课标Ⅰ卷)含答案
- 2024年认证行业法律法规及认证基础知识 CCAA年度确认 试题与答案
- 2022届“一本、二本临界生”动员大会(2023.5)
- 数学八年级上浙教版3.2直棱柱的表面展开图同步练习
评论
0/150
提交评论