模板
一.模板概述
模板把函数或类要处理的数据类型参数化,表现为参数的多态性。模板用于表达逻辑结构相同,且具体数据元素类型不同的数据对象的通用行为,从而使得程序可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。
1.函数模板与模板函数
在声明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的类型形参,然后生成一个重载函数的定义体与函数模板的函数定义体相同,它称之为模板函数。
函数模板是对一组函数的描述,它不是一个真实的函数,编译系统并不产生任何执行代码。
函数模板与模板函数的区别:函数模板是一个模板,其中用到通用类型参数,不能直接执行。模板函数是一个具体的函数,它由编译系统在遇到具体函数调用时所生成,具有程序函数的返回值能取任意类型。
2.类模板与模板类
类模板允许用户为类定义一种模式,使得类中的某些数据成员、成员函数的参数和成员函数的返回值能取任意类型。
在声明了一个类模板之后,可以创建类模板的实例,它称之为模板类。
类模板与模板类的区别:类模板是一个模板,不是一个实实在在的类,其中用到通用类型参数。而模板类是一个类,可以由它定义对象。
二.函数模板
1.声明函数模板
temple 类型形参表
返回类型 函数名(形参表)
{
函数体;
}
2.例子:
temple <class T>
T abs (T x)
{
if (x<0) return -x;
return x
}
3.函数模板的使用
函数模板是不能直接执行的,需要实例化为模板函数后才能执行。当编译系统发现有一个函数调用:
函数名(实参表);
C++将根据‘实参表’中的类型生成一个重载函数即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而‘形参表’的类型则以‘实参表’的实际类型为依据。
如以下语句实例化前面声明的函数模板:
Abs(-10);
由于-10为int型,所以实例化为以下真正的模板函数:
int abs (int x)
{
if (x<0) return -x;
return x;
}
再以-10为参数调用该模板函数,执行结果是返回10。
三.类模板
1.声明类模板
temple 类型形参表
Class 类名
{
类声明体;
};
Template 类型形参表
返回类型 类名 类型名表::成员函数1(形参表)
{
成员函数定义体;
}
Template 类型形参表
返回类型 类名 类型名表::成员函数2(形参表)
{
成员函数定义体;
}
................
Template 类型形参表
返回类型 类名 类型名表::成员函数n(形参表)
{
成员函数定义体;
}
2.例子
template <class T>
Class TClass1
{
T x,y;
public:
TClass1(T a,T b)
{
x=a;
y=b;
}
T add() {return x+y;}
Void disp()
{
Cout << x << “+” << y << “=” <<add() << endl;
}
};
3.类模板的使用
同样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。
“类型实参表”应与该类模板中的“类型形参表”相匹配。“对象表”是定义该模板类的一个或多个对象。