C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx

C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx

ID:51777223

大小:583.03 KB

页数:55页

时间:2020-03-07

C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx_第1页
C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx_第2页
C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx_第3页
C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx_第4页
C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx_第5页
资源描述:

《C++程序设计与实践 教学课件 作者 白忠建chapter10 模板和泛型编程.pptx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++程序设计与实践第十章模板和泛型编程电子科技大学信息与软件工程学院白忠建第十章模板和泛型编程本章要点模板的概念。C++的泛型机制用模板实现。函数模板和模板函数。一个函数模板是一类函数的抽象,由函数模板产生的函数称为模板函数,是函数模板的实例。类模板和模板类。一个类模板是多个只是数据类型不同的同种类的抽象,模板类是类模板的实例。容器类和迭代器。容器类是一类用于存储对象的机制,都是用模板实现的。而迭代器是一种类,用于封装迭代操作,使其与类型无关。泛型算法。泛型算法是用模板实现的一类通用操作,其操作与类型无关。10.1问题引入有的时候,我们不得不编写一系列非常相似的函数来处理不同类型的数

2、据。例如,考虑这样一个问题:编写全局函数来比较两个数的大小。整型版本boolGreater(constint&a,constint&b){returna>b;}浮点版本boolGreater(constdouble&a,constdouble&b){returna>b;}类版本booloperator>(constQuadrangle&a,constQuadrangle&b){returna.area()>b.area();}boolGreater(constQuadrangle&a,constQuadrangle&b){returna>b;}10.1问题引入voidf(){inta=

3、1,b=2;doublec=4.0,d=-1.0;Rectangler("r",3,4),t("t",5,6);Greater(a,b);Greater(c,d);//Greater(r,t);}callGreater(constint&,constint&)callGreater(constdouble&,constdouble&)callGreater(constQuadrangle&,constQuadrangle&)10.1问题引入问题的重点不在如何编写重载函数。请读者仔细观察重载函数的代码,可以发现这样一个事实:这些函数除了参数类型不同外(参数的名字完全可以不予考虑),其余部

4、分完全相同。提问:你会用什么方法来编辑这些源代码?这带来了一个问题:当函数的主体设计发生了改变,那么这些函数都必须全部根据这个设计而改变。这无疑对代码的维护造成了困难。是否可以设计出这样一种函数框架,但将类型本身作为参数传递呢?如果能这样,就能用一个版本的代码去适应所有的类型。10.1问题引入除了函数,类的设计也可能面临类型的问题。例如我们设计的类List。List是一个用链表实现的存储类,而这种类往往被称为“容器(container)”。就我们的应用而言,List容器存储的是对象指针。但仔细想来,其实换一种类型,例如浮点型,这个容器也能胜任。但如果没有特殊机制的支持,就必须针对于指定

5、的类型将该类重新写一遍。同样的问题是,这些代码除了类型外,其余部分完全相同。这显然是一种低效的设计模式。那么可否使用类型作为参数而形成通用的代码呢?10.1问题引入可以用了一种变通的方式完成上述任务。那就是使用宏。例如:#defineGreater(a,b)((a)>(b))利用继承和多态,这个宏可以工作的很好。但是,这个宏存在这明显的缺陷:参数没有类型。这有可能是程序员在使用宏时给出错误的参数,例如一个整数和一个对象。这显然会引起错误。宏还可能带来副作用。总之,宏是一种不可靠的机制。10.1问题引入针对于上述问题,C++提供了完美的解决方案,这就是模板(templates)。而使用模

6、板机制进行的程序设计就是泛型(generics)编程。泛型编程是指不依赖于任何具体类型来编写通用代码。具体类型信息的提供是在需要实例代码的时刻。由于类型的确定在编译之前已经确定,因此,泛型编程实际上是某种形式上的静态多态。10.2函数模板10.2.1函数模板的定义和使用函数模板看起来非常像是一个函数,但特别的语法使它只是看起来像而已,并不是一个真正的函数。当然,一旦函数模板被实例化,它就能履行真正的函数的功能。10.2函数模板1.函数模板的定义函数模板的形式化描述如下:template返回值类型函数名(参数列表){//函数体}可以使

7、用关键字class来代替typename关键字,二者没有区别。但建议读者选择typename,因为class可能会误导程序员,使他们片面地认为,类型参数只能是类类型。类型参数,可以是任意类型模板参数非类型参数,可以省略函数模板10.2函数模板比较大小函数模板可以写成这样:templateboolGreater(constT&a,constT&b){returna>b;}10.2函数模板为模板指定给一个整型常量min作为非类

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。