静态成员包括 静态数据成员 和 静态成员函数。当一个类的成员说明为static时,该类创建的所有对象都共享这个static成员,因此,静态成员是局部于类,而不是某个对象的特有成员。
静态数据成员:
如果定义n个同类的对象,那么每个对象都分别拥有自己的数据成员,各自有值,互不相关。有时需要某些数据成员在同类的多个对象之间可以共享,这就需要应用静态数据成员来实现。
在一个类中,若将一个数据成员说明为static,则该数据称为静态数据成员,它告诉编译器,无论建立多少个该类的对象,所有对象都共享一份静态数据成员。因此,静态数据的值对每个对象都是一样的。对静态数据成员的更新,就是对所有对象的该静态数据成员值的更新。
#include
>num;
cout<<"name?";
cin>>name;
cout<<"age?";
cin>>age;
}
void Student::Disp()
{
cout<<"学生的基本信息";
cout<"学号"<
代码运行结果:
0 1 1 2 2 2
说明:
1、静态数据成员只在类内声明时使用static关键字。
2、静态数据成员一定要在类体外进行初始化。
3、一般数据成员是在对象建立时分配控件,在对象删除时释放空间。而静态数据成员是在程序编译时分配空间,到程序结束时释放空间。
4、静态数据成员在所有对象之外单独存放,而不占用对象的存储空间。
5、与普通的数据成员一样,静态数据成员也有public、private、protected之分。在类外只能访问public的静态数据成员,不能访问private、protected的静态数据成员,访问形式有两种:
类名::静态数据成员名
对象名.静态数据成员名
静态成员函数:
静态成员函数主要用来访问类的静态成员,不能直接访问类的非静态成员。与静态数据成员一样,类外调用public静态成员函数时候,可有两种形式:
<类名>::<静态成员函数名>(<参数表>)
<对象名>.<静态成员函数名>(<参数表>)
/*
题目:已知班级学生的学号、姓名、英语成绩、数学成绩,求各门功课的平均成绩。要求能单独求出某门课程的平均成绩。
分析:数据成员
对象独有:num(学号)、name(姓名)、english(英语成绩)、math(数学成绩)
对象共享:number(人数)、sum1(英语总分)、sum2(数学总分),定义为static成员
分析:成员函数
构造函数:对num、name、english、math数据成员进行初始化,并累加统计总人数。
求总分函数Total:计算总成绩sum1、sum2
求平均值函数Aver1、Aver2:类内所有对象共享定义为static成员
*/
#include
using namespace std;
class Student
{
public:
Student();
void Init();
void Disp();
void Total();
static float Aver1();
static float Aver2();
static int number;
static float sum1;
static float sum2;
private:
int num;
char name[10];
float english;
float math;
};
int Student::number = 0;
int Student::sum1 = 0;
int Student::sum2 = 2;
Student::Student()
{
Init();
number+=1;
}
void Student::Init()
{
cout<<"xuehao?";
cin>>num;
cout<<"name?";
cin>>name;
cout<<"english score?";
cin>>english;
cout<<"math score";
cin>>math;
}
Void Student::Disp()
{
cout<<"xuehao:"<
说明:
1、静态成员函数是一个特殊的成员函数,它的调用不依赖于任何一个特定的对象,因此静态成员函数中没用隐含的this指针,因此,即使通过对象调用也不会传递当前对象的地址,所以,在静态成员函数中,如果要引用非静态成员则要提供访问的对象。一般,静态成员函数主要是引用静态成员。
2、静态成员函数可以实现在建立任何对象之前处理静态数据成员,完成建立任何对象之前都需要的与操作,这是非静态成员函数所不能实现的。