C++课件 第7篇 泛型1.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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函数并调用它。 如果给出的参数类型不一致,则编译器会报错。例如 #include?iostream #include?sumtest.h using?namespace?std; int?main(void) { ????????float?fa=1,fs; ????????int?i=3; ????????fs=sum(fa,i)

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档