最近用到了C++中的静态成员,在这里作一下总结。
C++中用static来修饰的成员称为静态成员。静态成员有别于其他存储类型的成员,它不是某个对象的成员,而是所有该类对象都共享的成员。可以利用这一特性来存储共享信息或进行数据传递。
静态成员包括静态数据成员和静态成员函数。
1.静态数据成员
静态数据成员在生成每一个类的对象时并不分配存储空间,而是该类的每个对象共享一个公共的存储空间,并且该类的所有对象都可以直接访问该存储空间。实现了同一个类的不同对象之间的数据共享。
必须在创建该类的对象之前为静态成员分配存储空间并设置初值,格式为:
静态成员数据类型 类名::静态数据成员=初值;
若不进行初始化则自动被初始化为0.
2.静态成员函数
与静态数据成员一样,他们属于类的静态成员,不是对象成员。因此,引用静态成员不需要对象名。静态成员函数只能访问类中的静态数据成员,或者通过对象来引用类中的非静态数据成员。
举例说明:
//st.h文件
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
class TStudent{
public:
TStudent(char *name,char *st_no,float score1);//统计学生姓名、学号与成绩的类
static void show_St(TStudent x);//声明静态成员函数
private:
char *sno;
char *sname;
float score;
static int count;//声明静态成员变量
static float sum;
static float avg;
};
TStudent::TStudent(char *name,char *st_no,float score1)
{
sname=new char[strlen(name)+1];
strcpy(sname,name);
sno=new char[strlen(st_no)+1];
strcpy(sno,st_no);
score=score1;
++count;
sum=sum+score;
avg=sum/count;
}
void TStudent::show_st(TStudent x)
{
cout<<setw(7)<<x.sno; //访问非静态成员,通过对象引用
cout<<setw(8)<<x.sname;
cout<<setw(8)<<x.score;
cout<<setw(8)<<sum; //访问静态成员,直接引用
cout<<setw(10)<<avg;
cout<<setw(8)<<count<<endl;
}
int TStudent::count=0; //初始化不能在构造函数中进行
float TStudent::sum=0.0;
float TStudent::avg=0.0;
//st.cpp文件
#include "st.h"
void main()
{
TStudent st1("汪洋","01",80); //所有对象s1、s2共享静态数据成员count、sum和avg
TStudent::show_st(st1); //访问静态成员函数
TStudent s2("刘丽","02",92);
TStudent::show_st(s2);
}
参考文献:《C++程序设计》,谭浩强