类模板:就是设计类的一种框架,可以适用于不同的数据类型,是类的抽象。利用类模板可以针对不同的数据类型定义出具有共性的一组类。
定义:
template<类型形参列表> class 类模板名
{
类模板定义;
};
其中类型参数列表与函数模板形式相同,如<template T1,template T2,...>
定义类模板时应注意以下几点:
①要是用关键字template
②类型形参列表可以包含抽象的形式类型,也可以是基本数据类型,但至少有一个参数,多个参数之间有逗号“,”隔开
③类模板的成员函数和普通类的定义一样,可在类中或类外定义。并且类模板的成员函数都是函数模板
template<类型形参列表>
函数返回类型 类模板名 <类型名表> :: 函数名(形参表)
{ 函数体}
④类模板本身不是具体的类,所涉及的数据类型都是抽象类型,要想使用类模板,必须先用实际的类型来取代抽闲的类型,此过程将确定类模板的实例,即模板类
类模板名 <类型实参表列> 对象名;
通过一个实例说明类模板的使用,适合任何类型的使用:
#include <iostream>
using namespace std;
template <typename T,int size> class SafeArray //定义类模板
{
private:
T ary[size]; //数组ary大小由模板参数size决定
public:
SafeArray(); //声明函数
T & operator[](int i);
void Print();
};
template <typename T,int size>
SafeArray<T,size>::SafeArray() //构造函数
{
int i;
for(i = 0;i<size;i++)
ary[i]=0; //初值设为0,对基本数据类型有效
}
template <typename T,int size>
T &SafeArray <T,size> :: operator[](int i) //重载运算符[]
{
if(i<0||i>=size) //进行下标安全性检查,超出下标范围就退出程序
{
cout<<"下标越界!"<<endl;
exit(0);
}
return ary[i];
}
template <typename T,int size>
void SafeArray <T,size> :: Print() //打印函数
{
int i;
for(i = 0;i<size;i++)
cout<<ary[i]<<" ";
cout<<endl;
}
int main()
{
SafeArray <int,5> si; //整型的类对象
SafeArray <float,4> sf; //float型的类对象
si[2] = 10;
sf[3] = 3.1f;
si.Print();
sf.Print();
return 0;
}
输出结果为:
0 0 10 0 0
0 0 0 3.1
由于类模板的这种类型无关的特点,类模板非常适合定义一些常用的数据结构,像堆栈,队列,链表等。
实例二,利用类模板实现堆栈
#include <iostream>
using namespace std;
template <typename T> class Stack
{
private:
T *pstk; //堆栈数据存储区指针变量
int size; //堆栈容量
int top; //判断是否到达的栈顶的变量
public:
Stack(int n); //构造函数
bool Push(T &t); //入栈函数
T *Pop(); //出栈函数
~Stack() //析构函数,用于释放动态分配的内存
{
delete[] pstk;
}
};
template <typename T>
Stack<T> :: Stack(int n)
{
pstk = new T[n];
size = n;
top = 0; //初始栈里没数据
}
template <typename T>
bool Stack<T> :: Push(T &t)
{
if(top >= size) //判断堆栈是否满了
{
cout<<"栈已经满了!"<<endl;
return false;
}
pstk[top++] = t; //没满就入栈
return true;
}
template <typename T>
T * Stack<T> :: Pop()
{
if(top <= 0) //判断堆栈是否为空
{
cout<<"栈为空!"<<endl;
return NULL;
}
return &pstk[--top]; //没空就出栈
}
int main()
{
int a=10,b=12,*pa=NULL;
Stack<int> stk(20); //定义用来存储整型数的堆栈对象stk,容量为20
stk.Push(a);
cout<<a<<endl;
stk.Push(b);
cout<<b<<endl;
pa = stk.Pop();
if(pa != NULL)
cout<<*pa<<endl;
pa = stk.Pop();
if(pa != NULL)
cout<<*pa<<endl;
pa = stk.Pop();
if(pa != NULL)
cout<<*pa<<endl; //此时堆栈为空
return 0;
}