//template <模板参数表>
//类声明
//定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括 起来的模板参数,然后是类名,格式如下
// template<class Type>
// class 类名 {
// //...
// };
//其中template是一 个声明模板的关键字,它表示声明一个模板. class 表示后边的 type 是类模板参数
//在类定义中,欲采用通用数据类型的数据成员、成员函数的参数或返回值,前面需加上Type
//在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则需要在函数体外进行模板声明,并且在函数名前的类名后缀上"<Type>"
//例如,成员函数在类定义体外定义为:
// template<class T>
//T complex<T>:: realcomplex()
//{return real;}
//类模板不代表一个具体的、实际的类,而代表着一类类。实际上,类模板的使用就是将类模板实例化成一个具体的类,它的格式为:
//类名<实际的类型>对象名;
//例如,使用上面的类模板,创建两个模板参数为double型的对象,语句如下:
//complex<double> s1,s2;
//创建两个模板参数为int型的对象:
//complex<int> s1,s2;
#include <iostream.h>
#include <stdlib.h>
// 结构体Student
struct Student
{
int id; //学号
float gpa; //平均分
};
//类模板:实现对任意类型数据进行存取
template <class T>
class Store
{
private:
T item; //用于存放任意类型的数据
int haveValue; //用于标记item是否已被存入内容
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>::GetElem(void)
{ //如果试图提取未初始化的数据,则终止程序
if (haveValue == 0)
{ cout << "No item present!" << endl;
exit(1);
}
return item; //返回item中存放的数据
}
template <class T> //存入数据函数的实现
void Store<T>::PutElem(T x)
{
haveValue++; //将haveValue 置为 TRUE,表示item中已存入数值
item = x; //将x值存入item
}
int 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 " ;
cout << D.GetElem() << endl; //输出对象D的数据成员
return 0;
}
C++学习笔记_9:类模板
最新推荐文章于 2024-07-24 13:36:39 发布