3.7 静态成员
【内容】静态成员分为静态数据成员和静态函数成员
【作用】为了实现一个类的多个对象之间的数据共享
1、静态数据成员
【类内声明格式】
static 数据类型 数据成员名
【类外定义格式】
数据类型名 类名::静态数据成员名=初始值;
【访问格式】
类名::静态数据成员名;
对象名.静态数据成员名;
对象指针->静态数据成员名;
【说明】
(1)静态数据成员是类的公共数据成员,是对象的共享数据
(2)私有静态数据成员不能在类外直接访问,必须通过公有的成员函数访问
(3)C++支持私有静态数据成员可以不必使用全局变量,其违反封装特性
2、静态成员函数
【定义格式】
static 返回类型 静态成员函数名(参数名);
【调用格式】
类名::静态成员函数(实参表);
对象名.静态成员函数(实参表);
对象指针->静态成员函数(实参表);
【说明】
(1)静态函数用来访问静态数据成员,当它与静态数据成员一起使用时,达到了对同一类中对象之间共享数据的目的
(2)私有静态成员函数不能做类外部的函数和对象访问
(3)在建立任何对象之前调用静态成员函数,以处理静态数据成员
(4)静态成员函数访问非静态数据成员,通过对象名、对象指针、对象引用访问该对象的非静态成员
3、示例
#include<iostream>
#include<string.h>
using namespace std;
class Students{
public:
Students(char* stu_name,char* stu_num,float stu_score);
~Students();
void show();
static void showcount(); //声明静态成员函数,用其访问静态数据成员
static void resetcount(); //声明静态成员函数,用其处理静态数据成员
static void showinfo(Students& stu); //声明静态成员函数,用其访问非静态数据成员
private:
char* name;
char* num;
float score;
static int count; //声明静态数据成员
};
Students::Students(char* stu_name,char* stu_num,float stu_score){
name=new char[strlen(stu_name)+1];
strcpy(name,stu_name);
num=new char[strlen(stu_num)+1];
strcpy(num,stu_num);
score=stu_score;
++count;
}
Students::~Students(){
delete []name;
delete []num;
--count;
}
void Students::show(){
cout<<"\n姓名:"<<name;
cout<<"\n学号:"<<num;
cout<<"\n分数:"<<score<<endl;
}
void Students::showcount(){ //静态成员函数访问静态数据成员
cout<<"\n人数:"<<count;
}
void Students::resetcount(){ //静态成员函数处理静态数据成员
count=0;
cout<<"\n人数格式化:"<<count;
}
void Students::showinfo(Students &stu){ //静态成员函数访问非静态数据成员
cout<<endl<<stu.name<<"同学的学号:"<<stu.num;
cout<<endl<<stu.name<<"同学的的分数:"<<stu.score<<endl;
}
int Students::count=0; //定义静态数据成员
int main()
{
Students stu1("Jeety","20190101",100);
stu1.show();
Students stu2("Joly","20190102",90);
stu2.show();
Students stu3("Jody","20190103",80);
stu3.show();
Students::showcount(); //访问静态数据成员
Students::resetcount(); //处理静态数据成员
Students::showinfo(stu3); //访问非静态数据成员
return 0;
}
【运行结果】