面向对象编程技术与方法 课件 第8章 模板_第1页
面向对象编程技术与方法 课件 第8章 模板_第2页
面向对象编程技术与方法 课件 第8章 模板_第3页
面向对象编程技术与方法 课件 第8章 模板_第4页
面向对象编程技术与方法 课件 第8章 模板_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象编程技术与方法(C++)

第8章模板第8章模板第8章

模板

8.1函数模板

8.1.1函数模板的定义与使用

8.1.2函数模板重载

8.1.3函数模板专门化

8.1.4使用标准库中的函数模板

8.2类模板

8.2.1类模板的定义与使用

8.2.2类模板专门化

8.2.3作为函数的参数及返回类型

8.2.4使用标准库中的类模板

8.2.5类模板的继承与派生

8.3小结

第8章模板8.1函数模板8.1.1函数模板的定义与使用

8.1.2函数模板重载 8.1.3函数模板专门化 8.1.4使用标准库中的函数模板第8章模板8.1函数模板8.1.1函数模板的定义与使用 函数重载将参数不同、功能类似的函数定义相同的名字,使用户感到含义清楚。但是对于函数设计者而言,仍要分别定义每个函数。对于功能相同、数据类型不同的函数,能不能只编写一次源代码呢?第8章模板可以定义一个函数,它的返回类型或形参类型(部分或全部)不具体指定,而用一个或多个抽象的类型参数来表示,这种函数形式就称为函数模板。在调用函数处,编译器会用具体的实参类型代替抽象的类型参数,这个过程称为实例化。第8章模板//例8-1.求两数之和的函数模板#include<iostream>usingnamespacestd;template<typenameT>//T为类型参数T

add(Tx,Ty){return(x+y);}

intmain(){ doubled1=0.5,d2=8.8;cout<<add(2,3)<<“,”;//T→int.或add<int>(2,3)cout<<add(d1,d2)<<endl;//T→double.或 //add<double>(d1,d2)return0;}函数模板并不是一个真正的函数。程序编译时,编译器根据调用语句中的实参类型对函数模板实例化,生成一个具体的可运行的函数。例如,编译add(2,3)时,编译器发现2和3是int型,于是使用如下版本的函数:

intadd(intx,inty){return(x+y);}编译add(d1,d2)时,编译器发现d1和d2是double型,于是使用如下版本的函数: doubleadd(doublex,doubley){return(x+y);}函数模板的形参列表中也可以带其他类型的参数。第8章模板运行结果:11.210第8章模板8.1函数模板8.1.1函数模板的定义与使用 8.1.2函数模板重载

8.1.3函数模板专门化 8.1.4使用标准库中的函数模板第8章模板8.1.2函数模板重载 函数模板也可以重载。编译器通过匹配过程,可以正确决定应该调用哪个函数形式。当程序中同时重载有函数模板和非模板函数时,编译器会优先选用非模板函数,当然前提是类型最佳匹配。如果一个调用有多于一个的匹配选择,则说明函数或函数模板在定义时存在歧义,编译时将会出错。8.1函数模板运行结果:4.4,4.4,8.8Dr第8章模板8.1函数模板8.1.1函数模板的定义与使用 8.1.2函数模板重载 8.1.3函数模板专门化

8.1.4使用标准库中的函数模板第8章模板8.1.3函数模板专门化 使用函数模板,编译器会根据实参类型自动将模板实例化,即用具体的数据类型代替类型参数。C++也提供一种将模板显性专门化的语法。即定义函数时,使用前缀“template<>”,后面是针对具体类型的函数定义:

template<> stringLarger<string>(stringx1,stringx2) {return(x1>x2)?X1:x2;}“template<>”的目的是告诉编译器,当数据类型为string时选用专门化的定义形式。其中函数名后面<string>可以省略。8.1函数模板运行结果:5.5template<>string-b2第8章模板8.1函数模板8.1.1函数模板的定义与使用 8.1.2函数模板重载 8.1.3函数模板专门化 8.1.4使用标准库中的函数模板第8章模板8.1.4使用标准库中的函数模板 C++标准库中的算法函数基本上都是模板,适用于数组等容器类型,编程时可以直接使用,但要#include相应的头文件。主要的头文件有<algorithm>、<utility>、<functional>、<numeric>等。下例演示如何使用标准库中定义的泛型函数,进行数组元素排序、复制、输出等操作。8.1函数模板运行结果:1.14.42.23.31.12.23.34.44.43.32.21.1第8章模板8.2类模板8.2.1类模板的定义与使用8.2.2类模板专门化 8.2.3作为函数的参数及返回类型 8.2.4使用标准库中的类模板 8.2.5类模板的继承与派生第8章模板8.2类模板8.2.1类模板的定义与使用 第8章模板类模板就像一个能装水、油等的容器,适用于多种数据类型。

template<typenameT1,typenameT2>

类定义在建立类对象处,编译器会用实际数据类型代替类模板中的类型参数,形成模板类,这是一个实例化的过程。一般来说,为了确保在每个必须实例化类模板的文件中都有类模板的定义,类模板定义应该放在头文件中。类模板的成员函数都是函数模板。运行结果:9,8,7,6,5,4,3,2,1,0,3.14第8章模板8.2类模板8.2.1类模板的定义与使用8.2.2类模板专门化

8.2.3作为函数的参数及返回类型 8.2.4使用标准库中的类模板 8.2.5类模板的继承与派生第8章模板8.2类模板8.2.2类模板的专门化 像函数模板一样,类模板也可以使用前缀template<>进行专门化定义。下例,要求产生int、double型的模板类时,使用类模板TStack进行实例化;当产生string型栈时,使用专门化的定义。运行结果:9,8,7,6,5,4,3,2,1,0,3.14template<>C++第8章模板8.2类模板8.2.1类模板的定义与使用8.2.2类模板专门化 8.2.3作为函数的参数及返回类型

8.2.4使用标准库中的类模板 8.2.5类模板的继承与派生第8章模板8.2类模板8.2.3作为函数的参数及返回类型 任何数据类型,包括用户自定义的类或类模板,都可以作为函数(模板)的参数和返回类型。例8-10求数组元素的最大/最小值及其索引:第8章模板8.2类模板8.2.1类模板的定义与使用8.2.2类模板专门化 8.2.3作为函数的参数及返回类型 8.2.4使用标准库中的类模板

8.2.5类模板的继承与派生第8章模板8.2类模板8.2.4使用标准库中的类模板 前面我们定义了一个简单的栈类模板TStack。实际上C++标准库已经为我们定义了一个栈类模板stack,使用时只要包含头文件<stack>即可。C++标准库中的类型大部分以模板的形式定义。运行结果:9876543210第8章模板8.2类模板8.2.1类模板的定义与使用8.2.2类模板专门化 8.2.3作为函数的参数及返回类型 8.2.4使用标准库中的类模板 8.2.5类模板的继承与派生第8章模板8.2类模板8.2.5类模板的继承与派生 运行结果:4,52.5,3.5radius=2.52,3radius=2第8章模板8.3小结模板将数据类型参数化,为我们提供一种源代码重用方法。对于功能相同而数据类型不同的操作,可以定义一个通用函数模板,在调用函数处编译器会用实参的类型代

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论