模板是C++支持参数化的工具。
使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员,某些成员函数的参数、返回值能取
任意类型。
1、类模板的声明形式
=====================
template <模板参数表>
类声明
=====================
注意:模板类的成员函数必须是函数模板
模板参数表包含下列内容:
a. class 标识符 //接受任意类型参数
b. 类型说明符 标识符 //接受常量参数
2、使用一个模板类来建立对象
=====================
模板<模板参数表> 对象名1,...,对象名n;
=====================
3、成员函数的的声明
=====================
template <模板参数表>
返回值类型 类名<标识符1,...,标识符n>::函数成员名(参数表)
{
函数体
}
=====================
其中“标识符”是指模板参数表中的标识符
#include <iostream.h>
#include <stdlib.h>
struct Student
{
int id;
float gpa;
};
template <class T> //类模板,实现对任意数据类型进行存取
class Store
{
private:
T item;
int haveValue;
public:
Store(void); //默认形式(无型参)的构造函数
T GetElem(void);//提取数据函数,返回值和型参都是任意类型数据;
void PutElem(T x);
};
//以下实现各成员函数
//注意:类模板成员函数,若在类外实现,则必须是模板函数
//默认形式的构造函数的实现,无返回值。
template <class T>
Store<T>::Store(void):haveValue(0)
{}
//提取数据函数的实现
//在类外定义必须由作用域运算符"::"来通知编译系统该函数所属的类
//且必须指明类的函数模板,下文中“template <class T> T Store<T>”
//template <class T>是模板定义的类型,T是成员函数GetElem(void)的返回值
//类Store<T>所指明的参数类型名称T必须是在类模板中定义的
template <class T>
T Store<T>::GetElem(void)
{
if(haveValue==0)
{
cout<<"No item present!"<<endl;
exit(1);
}
return item;
}
//存入数据函数实现
template <class T>
void Store<T>::PutElem(T x)
{
haveValue++;
item=x;
}
void main(void)
{
Student g={1000,23};
Store<int>S1,S2;
Store<Student>S3;
Store<double>D;
S1.PutElem(3);
S2.PutElem(-7);
cout<<S1.GetElem()<<" "<<S2.GetElem()<<endl;
S3.PutElem(g);
cout<<"The student ID is "<<S3.GetElem().id<<endl;
cout<<"Retrieving object D "<<endl;
cout<<D.GetElem()<<endl;
}