C++之模板及标准模板类
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
z 将参数类型用T表示,得到如下形式的通用函数:
z 调用函数时用int或double代入T即可,即将数据类型作为参 数传递
4/78
z 例2:以下两个类
class A {
int i; public:
A(int a) { i=a; } void set (int b) { i=b; } };
z 特点: z 结构相同 z 仅类型不同,则可合并为 z 在建立对象时用int或double
10/78
4.函数模板与重载函数一起使用的调用约定:
z 先寻找重载函数。 z 如找不到相应的重载函数则找函数模板。 z 如再找不到则进行强制类型转换,此时可能丢失精度
(下面举例说明)。
11/78
例:函数模板与重载函数一起使用的调用顺序:求两个数中最大数
template <class T> T Max(T a,T b) {
7/78
1.函数模板的定义方法
z 函数模板是对一组函数的抽象 z 函数模板的格式如下:
template <class T1,class T2,…> 类型 函数名(参数表)
{ 函数体
}
Fra Baidu bibliotek
template <typename T1,typename T2,…> 类型 函数名(参数表)
{ 函数体
}
z template 为模板定义标志 z class或typename是一个标志,表示其后为参数化的类型名。
cout<<"Loading fucntion2:";
return (x>y)?x:y; }
void main() {
int i=10; char c='a'; double d=15.67; cout<<Max(i,i)<<endl; cout<<Max (c,c)<<endl; cout<<Max(i,c)<<endl; cout<<Max(c,i)<<endl; cout<<Max(d,d)<<endl; cout<<Max(d,i)<<endl; }
3/78
z 例1:以下两个函数
int add(int a,int b) {
return a+b; }
double add(double a,double b) {
return a+b; }
z 特点:
T add(T a,T b) {
z 函数名字相同、参数个数相同, }
z 参数类型和返回值类型不同
return a+b;
输出结果: 8 6.7 B
9/78
3.函数模板与重载函数一起使用
例2.求两个数、3个数和多个数中最小数的函数模板
template <class T> T Min(T a,T b) {
return a<b?a:b; }
template <class T>
T Min(T a,T b,T c) {
T temp=a<b?a:b; return temp<c?temp:c; }
8/78
2.函数模板的使用
例1:编写求两个相同类型数中最大数的函数模板。
template <class T> T Max(T a,T b) //T为模板参数 {
return a<b?b:a; }
#include <iostream.h> void main() {
cout<<Max(5,8) <<endl; //模板函数 cout<<Max(5.5,6.7) <<endl; cout<<Max('A','B') <<endl; }
z 概念:
z 模板是一种对类型进行参数化的工具。 z 通常有两种形式:函数模板和类模板 z 函数模板针对仅参数类型不同的函数; z 类模板针对仅数据成员和成员函数类型不同的类。
6/78
8.1 模板的基本概念 8.2 函数模板及类模板 8.3 标准模板类库STL简介 8.4 向量 8.5 链表类的使用 8.6 双端队列 8.7 栈与队列 8.8 集合
cout<<"template:"; return a<b?b:a; }////////////////////////// int Max(int x,int y) { cout<<"Loading function0:"; return (x>y)?x:y; }/////////////////////////////////// int Max(char x,int y) { cout<<"Loading function1:"; return (x>y)?x:y; }//////////////////////////// int Max(int x,char y) {
Loading function0:10 template: a Loading function2: 97 Loading function1: 97 template: 15.67 Loading function1: 15
12/78
1.类模板的定义格式:
template <class T1,class T2,…> class 类名 {
代入T即可!即将数据类型作 为参数传递。
5/78
class B {
double i; public:
B(double a) { i=a; } void set (double b) { i=b; } };
class C {
T i; public:
A(T a) { i=a; } void set (T b) { i=b; } };
template <class T> T Min(T s[],int n) {
T temp=s[0]; for(int i=0;i<n;i++)
if(temp>s[i]) temp=s[i]; return remp; }
1. 以上三个函数都是模板—符合 模板定义,
2. 这三个函数又是重载函数—它 们名称相同,但参数不同,所 以它们又是重载函数。
第8章 模板及标准模板类
哈尔滨工业大学软件学院
1
模板是C++支持参数化多态的工具,使用模板可 以使用户为类或者函数声明一种一般模式,使得类中 的某些数据成员或者成员函数的参数、返回值取得任 意类型。
本章首先探讨函数模板,进而引入类模板。
2/78
8.1 模板的基本概念 8.2 函数模板及类模板 8.3 标准模板类库STL简介 8.4 向量 8.5 链表类的使用 8.6 双端队列 8.7 栈与队列 8.8 集合