一、静态数据成员
1.存储空间的分配
定义类时分配空间,一般的数据成员依附于对象,定义类时不为其分配存储空间,只有定义对象时才分配存储空间。而静态数据成员不依附于任何特定对象,为所有对象所共有,不是定义对象时才分配存储空间,而是定义类时就为静态数据成员分配存储空间,供各对象所共享使用。
2.在程序运行时始终存在
对于静态数据成员,定义类时分配存储空间,程序结束时才收回分配的存储空间。
3.只能在类外进行初始化
对静态数据成员的初始化,只能在类外进行,赋值语句的语法如下:
类型吗 类名:: 静态数据成员名=初值;
例如:
int A::a=0;//将A类的静态数据成员赋值为0
如果没有为静态成员赋值,系统默认初值是0.
4.可以通过类名访问
一般数据成员只能通过对象名或者指针方式访问,而静态数据成员既可以通过对象名或指针的方式访问,也可以通过类名访问:
语法如下:
类名::对象名;
如访问类A中的静态成员a:
cout<<A::a<<endl;
二、静态成员函数
1.声明格式
static 返回类型 函数名(形式参数表);
2.访问方式
和静态数据成员一样,静态成员函数既可以通过对象名调用也可以通过类名调用。
三、示例
//创建教职工类
class Employee
{
public:
Employee(int num = 0, string name = "", float salary = 0);//带默认值的构造函数
void setValue(int num = 0, string name = "", float salary = 0);//赋值函数
void total();//总数的求法
static void average();//求平均工资
private:
int empNum; //职工编号
string empName; //职工姓名
float empSalary; //职工工资
public:
static int empSumEmp;//职工总数
static float empSumSal;//工资总额
static float empAveSal;//平均工资
};
int Employee::empSumEmp=0;//职工总数在类外初始化
float Employee::empSumSal=0;//工资总额在类外初始化
float Employee::empAveSal=0;//平均工资在类外初始化
Employee::Employee(int num, string name, float salary)
{
empNum = num;
empName = name;
empSalary = salary;
}
void Employee::setValue(int num , string name, float salary)//赋值函数的定义
{
empNum = num;
empName = name;
empSalary = salary;
}
void Employee::total()//总数的求法
{
empSumSal+= empSalary;
empSumEmp++;
}
void Employee::average()//求平均工资
{
empAveSal = empSumSal / empSumEmp;
}
主函数中有如下代码:
Employee emp[5];//创建对象数组
for (int i = 0; i < 5; i++)
{
int num;
string name;
float salary;
cout << "输入职工编号" << endl;
cin >> num;
cout << "输入职工姓名" << endl;
cin >> name;
cout << "输入职工工资" << endl;
cin >> salary;
emp[i].setValue(num, name, salary);//位每个对象赋值
}
for (int i = 0; i < 5; i++)
{
emp[i].total();//求总和
}
Employee::average();//求平均工资
cout << "职工总数=" << Employee::empSumEmp << endl;//类作用域访问静态成员
cout << "工资总额=" << Employee::empSumSal << endl;
cout << "平均工资=" << Employee::empAveSal << endl;
运行截图如下: