- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 类属 首都师范大学
第七章 类属和模板 在程序设计中,我们总会发现程序的某些组成模块 所实现的逻辑功能是相同的,而不同的只是被处理对 象(数据)的类型,例如下列函数模块: int max(int x, int y) { return (x y)? x : y; } float max(float x, float y) { return (x y)? x : y; } double max(double x, double y) { return (x y)? x : y; } 若能将处理对象(数据)的类型作为参数传递给提 供同一逻辑功能的模块,便可以实现用同一模块处理 不同类型对象的目的,从而大幅度地提高代码重用度 和可维护性。这种将程序模块编写成参数化模板的方 法就是类属编程。 在 C++ 中,类属编程有两种实现方式: ⑴ 传统的采用创建类属数据结构的编程方式; ⑵ 采用 C++ 提供的类属工具 —— 参数化模板进行编 程的方式。 本章的重点是模板编程,但对传统类属编程的了解 将有助于对模板的理解。 ⑵ 模板类可以有多个参数,例如: #include iostream.h template class T1, class T2 class myclass { T1 i; T2 j; public: myclass(T1 a, T2 b) { i = a; j = b; } void show() {cout i = i j = j endl; } }; main() { myclass int, double ob1(12, 0.15); myclass char, char* ob2(*, This is a test); ob1.show(); ob2.show(); return 1; } 运行显示如下结果: i = 12 j = 0.15 i = * j = This is a test ⑶ 在使用类模板的源程序中必须包含类模板的完全定 义,即不仅要包含类模板的定义代码,还要包含类 模板的实现代码。因此,如果类模板的完全定义分 写在头文件 .h 和实现文件 .cpp 两个文件中,则在使 用类模板的源程序中就必须包含能体现类模板完全 定义的实现文件 .cpp,而不能只包含仅体现类模板 定义的 .h。例如:程序中有一个类模板 vector,其 定义代码在 vector.h 中,实现代码在 vector.cpp 中, 则在使用类模板 vector 的程序源文件中使用的包含 应该是: #include “vector.cpp” 而不应是 #include vector.h 。 2 类模板使用举例 例7-2 定义一个简单队列类模板,并将该模板实例化一 个对自定义职员类信息进行存储和操作的队列。 问题分析: 简单队列是最有代表性的一种队列是一种具有 “先 进先出” 操作机制的数据容器。队列中存放的数 据,可以是预定义或自定义的任何类型。 本例中采用了链表队列模板。首先定义一个结构模 板 quenode 作为队列的结点,它与定义类模板方法 类似,再定义一个队列类模板 queue,结构模板和 类模板取同样的模板形参名 T。 另外定义了一个职员类 staff,并将队列模板 queue 实例化为 staff 类型的队列 staffque。 结构模板 quenode、队列类模板 queue、职员类 staff 和实例化后的职员信息队列对象 staffque 之间的关 系如下图所示: quenode +nodedata:T +next:quenode* T queue #head:quenodeT #tail:quenodeT #quesize:int #allocateerror:bool #copy(in q:queueT):queueT +pop(in x:T):bool +push(in x:T) +isempty() +operator=(in q:queueT):queueT +getallocateerror():bool T head 1 tail 1 staff +name:string +sex:string +age:int +salary:float +assign(in name:string, in age:int, in salary:float, in sex:string) +print() staffque: bind staff
文档评论(0)