一、类模板的静态成员
1、概念:与普通类中的静态成员类似,模板类中的静态成员并不仅仅属于某一个对象,它可以实现对象之间的数据共享,静态成员包括:静态数据成员和静态函数成员。
2、初始化:静态数据成员只能在类模板定义的外部进行初始化,而成员函数既可以在类体内进行初始化,又可以在类体外进行初始化。
3、实例:定义一个学生类模板,计算学生某一科的平均成绩。
/***********************************************************
时间:2016年10月8日11:23:53
功能:定义一个学生类,定义静态成员函数,用于求某科的平均值
************************************************************/
#include <iostream>
using namespace std;
//定义模板类
template <typename T>
class Student
{
public:
Student(char *pn,double c,double m); //构造函数,分别给出学生姓名,语文和数学成绩
T average(double c,double m); //求两科的平均分
static double chinese_add();
static double math_add();
static double chinese_mean(); //求语文的平均成绩
static double math_mean(); //求数学的平均成绩
char name[10];
static double chinese; //定义两门课的成绩
static double math;
static double chinese_sum;
static double math_sum;
private:
};
template <typename T> //构造函数实现
Student<T>::Student(char *pn,double c,double m)
{
chinese = c;
math = m;
strcpy(name,pn);
}
template <typename T> //求平均分函数的实现
T Student<T>::average(double c,double m)
{
return (math+chinese)*1.0/2;
}
template <typename T> //求总的语文成绩
double Student<T>::chinese_add()
{
chinese_sum += chinese;
return chinese_sum;
}
template <typename T> //求总的数学成绩
double Student<T>::math_add()
{
math_sum += math;
return math_sum;
}
template <typename T>
double Student<T>::chinese_mean() //求语文的平均成绩函数的实现
{
return chinese_sum/3;
}
template <typename T>
double Student<T>::math_mean() //求数学的平均成绩函数的实现
{
return math_sum/3;
}
template<typename T> double Student<T>::chinese = 0; //初始化静态数据成员
template<typename T> double Student<T>::math = 0;
template<typename T> double Student<T>::chinese_sum = 0;
template<typename T> double Student<T>::math_sum = 0;
void main()
{
cout<<"name"<<"\tchinese"<<"\tmath"<<"\tmean"<<endl;
Student<double> student1("king",82,85.3); //定义对象并初始化
cout<<student1.name<<"\t"<<student1.chinese<<"\t"<<student1.math<<"\t"<<student1.average(82,85.3)<<endl;
Student<double>::chinese_add(); //调用累加函数
Student<double>::math_add();
Student<double> student2("ling",81.5,87); //重新定义对象并初始化
cout<<student2.name<<"\t"<<student2.chinese<<"\t"<<student2.math<<"\t"<<student2.average(81.5,87)<<endl;
Student<double>::chinese_add();
Student<double>::math_add();
Student<double> student3("juan",98.9,96.5); //重新定义对象并初始化
cout<<student3.name<<"\t"<<student3.chinese<<"\t"<<student3.math<<"\t"<<student3.average(98.9,96.5)<<endl;
Student<double>::chinese_add();
Student<double>::math_add();
cout<<"Average"<<"\t"<<Student<double>::chinese_mean()<<"\t"<<Student<double>::math_mean()<<endl;
}
二、非类型的类模板参数
1、概念;类模板的参数可以不仅仅是类型参数,普通值也可以作为类模板的参数,这种参数叫做非类型参数,非类型参数类似于函数参数,就是在类型后面跟上变量名。但是,非类型模板参数是有限制的,非类型模板参数只能是整型类型或者指针类型,这是因为指针的本质其实就是一个整型类型的值。