类模板
类模板也称为类属类或类生成类,是为类定义的一种模式,它使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。
类模颁布是一个具体的类,它代表着一族类,是这一族类的统一模式。
使用类模板就是要将它实例化为具体的类。
定义类模板的一般形式为:
template<class 数据类型参数标识符>
class 类名
{
//……
}
其中,template是声明类模板的关键字;template后面的尖括号不能省略;数据类型参数标识符是类模板中参数化的类型名,当实例化类模板时,它将由一个具体的类型来代替。
定义类模板时,可以声明多个类型参数标识符,各标识符之间用逗号分开。
类定义中,凡要采用标准数据类型的数据成员、成员函数的参数或返回类型的前面都要加上类型标识符。
如果类中的成员函数要在类的声明之外定义,则它必须是模板函数。
其定义形式为:
template<class 数据类型参数标识符>
数据类型参数标识符类名<数据类型参数标识符>∷函数名(数据类型参数标识符形参1,……,数据类型参数标识符形参n)
{
函数体
}
模板类
将类模板的模板参数实例化后生成的具体的类,就是模板类。
由类模板生成模板类的一般形式为:
类名<数据类型参数标识符>对象名1,对象名2,…,对象名n;
这里的数据类型参数标识符对应的是对象实际需要的数据类型。
6.4 应用举例
例6.1 函数模板的声明和模板函数的生成的例。
#include<iostream.h>
template<typename T> //声明模板函数,T为数据类型参数标识符void swap(T &x, T &y) //定义模板函数
{
T z; //变量z可取任意数据类型及模板参数类型T
z=y;
y=x;
x=z;
}
void main()
{
int m=1,n=5;
double a=8.9,b=3.4;
cout<<”m=”<<m<<”n=“<<n<<endl;
cout<<”a=”<<a<<”b=”<<b<<nedl;
swap(m,n); //实例化为整型模板函数
swap(a,b); //实例化为双精度型模板函数
cout<<“m与a,n与b交换以后:”<<endl;
cout<<”m=”<<m<<”n=“<<n<<endl;
cout<<”a=”<<a<<”b=”<<b<<endl;
}
程序运行结果:
m=1 n=5
a=8.9 b=3.4
m与a,n与b交换以后:
m=5 n=1
a=3.4 b=8.9
例6.2 类模板的声明和模板类的生成的例。
#include<iostream.h>
const int size=10;
template<class T>
class stack
{
T stck[size];
int t;
public:
stack(){t=0;}
void push(T ch);
T pop();
};
template<class T>
void stack<T>::push(T ob)
{
if (t==size)
{
cout<<”stack is full!”<<endl;
return 0;
}
stck[t]=ob;
t++;
}
template<class T>
void stack<T>::pop()
{
if (t==0)
{
cout<<”stack is empty!”<<endl;
return 0;
}
t--;
return stck[t];
}
main()
{
stack<char>cs1,cs2;
int i;
cs1.push(‘a’);
cs2.push(‘x’);
cs1.push(‘b’);
cs2.push(‘y’);
cs1.push(‘c’);
cs2.push(‘z’);
for(i=0;i<3;i++)
cout<<”pop cs1:”<<cs1.pop()<<endl;
for(i=0;i<3;i++)
cout<<”pop cs2:”<<cs2.pop()<<endl;
stack<int>is1,is2;
is1.push(1);
is2.push(2);
is1.push(3);
is2.push(4);
is1.push(5);
is2.push(6);
for(i=0;i<3;i++)
cout<<”pop is1:”<<is1.pop()<<endl;
for(i=0;i<3;i++)
cout<<”pop is2:”<<is2.pop()<<endl;
return 0;
}
程序运行结果:
pop cs1:c
pop cs1:b
pop cs1:c
pop cs2:z
pop cs2:y
pop cs2:x
pop is1:5
pop is1:3
pop is1:1
pop is2:6
pop is2:4
pop is2:2。