- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 泛型1----基本概念
这一章的内容包括:
泛型的概念
模版函数
模版类
C++ STL简介
一、泛型的概念
本小节涉及的概念对很多编程语言是通用的,讲述概念使用的是伪代码。
泛型,英文名字是generic programming,或许译成“通用编程”更合适。也有人叫它参数化的类、模版类、类的类,元类(metaclass)。像类一样,泛型也是一种抽象数据类型,但是泛型不属于面向对象,它是面向对象的补充和发展。
自面向对象出现以来,就有人发现,当算法与数据类型有关时,面向对象在对算法的抽象描述方面存在缺陷。
比如对堆栈的描述:
class stack
{
push(参数类型) //入栈算法,内部过程略
pop(参数类型) //出栈算法,内部过程略
}
如果把上面的伪代码看作是纸上的算法描述,没问题,因为“参数类型”与算法无关。但是如果把它当成可编译的源代码,就不同了,“参数类型”是什么类型?整型、浮点、字符、数组、结构体……?必需明确指定“参数类型”究竟是哪一种。
使用面向对象的技术,可以用重载来解决这个问题,即对N种不同的“参数类型”写N个push和pop算法,这实在是太麻烦,不能叫“通用编程”。
这是面向对象的局限:当算法与数据类型有关时(这在编程中常遇到),面向对象不能做恰当的处理。
上面的stack类,“参数类型”影响了类的通用性,对该类做通用化的改造:
//定义类模板,参数为T,T是数据类型,但不具体指定是哪一种
class stack 参数模版 T
{
push(T) //入栈算法,内部过程略
pop(T) //出栈算法,内部过程略
}
我们说这个类具有了通用性,因为它有了参数模版 T,T是个占位符,当我们“实例化”这个类时,指定T的类型(比如T为int),然后int替换掉T。
这时候类S就成为:
class S
{
push(int) //入栈算法,内部过程略
pop(int) //出栈算法,内部过程略
}
我们说class stack参数模版 T是“类的类”,或“元类metaclass”,它可以“实例化”出类S参数模版 int。
泛型可以在几乎无损于效率的情况下支持代码的高度可复用性,并且具有数学的抽象美(比重载好多了)。于是,泛型就成了现代编程语言中重要的特性之一。
泛型编程带来的是前所未有的弹性以及不会损失效率的抽象性,是用泛型可以撰写通用的可重复使用的算法,其效率与针对特定数据结构而设计的算法旗鼓相当,而描述更加简洁。 如果说面向对象的继承实现了子类型的多态的话,那么泛型则是实现了类的参数的多态,两者都是抽象机制的重要组成部分,具有互补性:继承往往代表了不同的算法,但泛型往往代表了相同的算法不同的类型。泛型在表示与数据类型有关的算法时,比面向对象的函数重载或继承更好。
现在的很多编程语言和开发环境都支持泛型。比如:
C++的STL(Standard Template Library,标准模板库)
VC++的ATL(动态模板库),专用于COM组件的编写。
JAVA和.NET的新版本也支持泛型。
但它们对泛型的具体实现思路、语法等方面都有所不同。
泛型的思想在C++中实现为模版函数和模版类,先看C++模版函数。
二、C++模版函数
使用普通的函数实现一个与数据类型有关的算法,是非常繁锁的。比如实现两个数的加法函数,要考虑很多数据类型:
short?sum(short?a,short?b)?{return?a+b;} int?sum(int?a,int?b){return?a+b;} float?sum(float?a,float?b){?return?a+b;} ……
在C语言里处理同名不同参数的函数不太方便(C标准库里,常用的数学运算一般只考虑double和int型)。C++虽可用函数重载解决此问题,但反复写相同算法的函数对程序员太辛苦,更重要的是函数重载是静态编译的,运行时占用过多内存。
可以用c++的模板函数来表达“通用型的函数”,设计以下模板函数:
template typename?T //函数模版声明T?sum(T?a,T?b) //注意形参和返回类型
{???
?return?a+b;}
c++编译器可以根据调用sum函数的参数类型“现场”生成一个适当的函数,然后调用它。例如: #include?iostream using?namespace?std; ?int?main(void) { ???????float?fa=1, fb=3, fs; ???????fs=sum(fa,fb); //现场用float匹配模版参数T?????} c++编译器生成一个“float版本”的sum函数并调用它。
您可能关注的文档
- 专技天下试题和答案.doc
- 第三章 习题(带答案).doc
- Ch6 SAS基本统计过程(二) freq.ppt
- 第九章排序习题_数据结构.doc
- An Introduction to Database System.ppt
- 企业文档管理解决方案.ppt
- 指令系统习题解答.doc
- 消化内科学试卷(B卷).doc
- 习题(七)宏.ppt
- 消化内科学考试试卷及答案C.doc
- 福莱特玻璃集团股份有限公司海外监管公告 - 福莱特玻璃集团股份有限公司2024年度环境、社会及管治报告.pdf
- 广哈通信:2024年度环境、社会及治理(ESG)报告.pdf
- 招商证券股份有限公司招商证券2024年度环境、社会及管治报告.pdf
- 宏信建设发展有限公司2024 可持续发展暨环境、社会及管治(ESG)报告.pdf
- 品创控股有限公司环境、社会及管治报告 2024.pdf
- 中信建投证券股份有限公司2024可持续发展暨环境、社会及管治报告.pdf
- 洛阳栾川钼业集团股份有限公司环境、社会及管治报告.pdf
- 361度国际有限公司二零二四年环境、社会及管治报告.pdf
- 中国神华能源股份有限公司2024年度环境、社会及管治报告.pdf
- 广西能源:2024年环境、社会及治理(ESG)报告.pdf
最近下载
- 机械行业“人形机器人的Optimus时刻”系列(五):触觉感知(电子皮肤),高山将越,坦途在望.pdf
- 培训教材污水处理厂运营管理方案.pptx VIP
- 纪检委处理回复函.docx
- AP微积分BC 2016年真题 (选择题+问答题) AP Calculus BC 2016 Released Exam and Answers (MCQ+FRQ).pdf VIP
- 武汉市2025届高中毕业生四月调研考试(四调)物理试卷(含答案).pdf
- 《西安事变》课件.ppt VIP
- 排水沟设计计算11.xls VIP
- 2010版中药典,中国药典2010年版.doc
- 精彩拍摄跟我来.docx
- 小学常用单词分类汇总衡水体英语字帖(含例句).pdf
文档评论(0)