类模板2——静态成员以及非类型的类模板参数

一、类模板的静态成员

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、概念;类模板的参数可以不仅仅是类型参数,普通值也可以作为类模板的参数,这种参数叫做非类型参数,非类型参数类似于函数参数,就是在类型后面跟上变量名。但是,非类型模板参数是有限制的,非类型模板参数只能是整型类型或者指针类型,这是因为指针的本质其实就是一个整型类型的值。




发布了56 篇原创文章 · 获赞 50 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/jinpeng_cumt/article/details/52755008