1、概念:类模板是一个参数化类型,也就是使用一个或者多个参数创建一系列类的方式。在C++标准库中,有一种叫做容器类,这种类可以用来管理某种特定类型的元素。这样的 一个容器是通过模板来实现的,不需要确定容器中元素的具体类型,这样定义的类型更加便于管理。
2、类模板的定义:
template<模板参数列表> class <类名>
{
//类模板的实现
};
类模板与普通类最大的区别就在于参数模板,一般的类的参数类型都固定了,而类模板的参数可以在实例化的时候确定。参数列表包含两种类型的参数:类型参数和非类型参数,类型参数就是用typename或者class来修饰的不确定类型;而非类型参数是指某种具体的参数,如int类型变量a,char类型变量b。
eg:template<typename T,int a>
class Student
扫描二维码关注公众号,回复:
9595288 查看本文章
{
//类体;
};
上述例子定义了一个Student的类模板,该模板的参数有类型参数T和非类型参数int a。
3、实例:定义简单的Student的类模板,并用该模板实例化产生一些类。
/***********************************************************
时间:2016年10月8日10:11:18
功能:定义一个学生类,并定义函数模板,求两门课的平均分
************************************************************/
#include <iostream>
using namespace std;
//定义模板类
template <typename T3,typename T1,typename T2>
class Student
{
public:
Student(char *pn); //构造函数
T3 average(T1 c,T2 m); //求两科的平均分
void print()
{
cout<<"The student's name = "<<name<<endl;
}
private:
char name[10];
T1 chinese; //定义两门课的成绩
T2 math;
};
template <typename T3,typename T1,typename T2> //构造函数实现
Student<T3,T1,T2>::Student(char *pn)
{
strcpy(name,pn);
}
template <typename T3,typename T1,typename T2> //求平均分函数的实现
T3 Student<T3,T1,T2>::average(T1 c,T2 m)
{
chinese = c;
math = m;
return (math+chinese)*1.0/2;
}
void main()
{
double mean; //定义平均分
Student<double,int,double> student1("king"); //定义对象并初始化
Student<int,double,double> student2("juan"); //定义对象并初始化,注意初试话时类型参数定义的是不一样的
student1.print(); //打印学生姓名
mean = student1.average(84,86.5);
cout<<"The mean of student1's two subject is: "<<mean<<endl;
student2.print(); //打印学生姓名
mean = student2.average(89.2,86.5);
cout<<"The mean of student2's two subject is: "<<mean<<endl;
}
运行结果如下图所示:
从上图结果可以看出,定义了类模板,其中含有3个类型参数,这三个参数用于求取平均成绩的函数模板中。上图中定义的第一个对象成绩的返回值定义的为double型,而第二个对象成绩的返回值为int型,所以在结果中可以清楚地看到区别,这样体现了类模板的优势,只有定义一种类型的模板,就可以实现不同对象的定义。