类模板声明的语法形式是;
template<模板参数>
class 类名
{
类成员声明
}
如果需要在类模板意外定义其成员函数,则要采用以下的形式:
template<模板参数>
类型名 类名<模板参数标示符列表>::函数名(参数表)
一个类模板声明自身并不是一个类,他声明了类的一个家族。只有当其他代码引用时,模板才根据引用的需要生成具体的类。
使用一个类模板建立对象时,应按如下形式声明:
模板名<模板参数表>对象名1,对象名2,...,对象名n;
实例介绍:
#include<iostream>
#include<cstdlib>
using namespace std;
struct Student{//结构体
int id;//学号
float qpa;//平均分
};
template<class T>//类模板实现对任意数据类型的存取
class Store{
private:
T item;//item用于存放放任意数据类型的数据
bool haveValue;//haveValue用于标记item是否已被存入内容
public:
Store();//默认形式无参的构造函数
T &getElem();//提取数据函数
void putElem(const T &x);//存入数据函数
};
//以下实现个成员函数
template<class T>//默认构造偶函数实现
Store<T>::Store():haveValue(false){}
template<class T>//提取数据函数的实现
T &Store<T>::getElem(){
if(!haveValue){ //如果试图提取未初始化的函数,则终止程序
cout<<"No item present"<<endl;
exit(1); ///使程序完全退出,返回到操作系统
//参数可用来表示程序终止的原因,可以被操作系统接受
}
return item;
}
template <class T>
void Store<T>::putElem(const T &x){
haveValue=true;//将havevalue的值置为true,表示item中已存入数值
item=x;//将x值存入item
}
int main(){
Store<int>s1,s2;//定义两个Store<int>类对象,其中数据成员item为int类型
s1.putElem(3);//向s1中存入数据,即初始化
s2.putElem(-7);//向s2中存入数据,
cout<<s1.getElem()<<""<<s2.getElem()<<endl;
//输出s1,s2的数据成员
Student g={1000,23};
//定义Student类型结构体变量的同事付初值
Store<Student>s3;
//定义 Store<student>类对象s3,其中数据成员item为Student类型
s3.putElem(g);//向s3中存入数据
cout<<"The student id is"<<s3.getElem().id<<endl;
//输出对象s3的数据成员
Store<double>d;//定义 Store<double>类对象d,其中数据成员item为double类型
cout<<"Rretrieving object d ……"<<endl;
cout<<d.getElem()<<endl;
//输出对象d的数据成员
//由于d未经初始化,在执行函数d.getElem()过程中导致程序终止
return 0;
}