静态数据成员
概念:为了实现一个类的多个对象的数据共享,C++提出了静态数据成员这一概念。
1.静态数据成员
- 格式:
static 数据类型 数据成员
- 初始化:
类名 ::数据类型 数据成员=初始数值
区别于其它的数据成员,静态成员的初始化需要在“类”与主函 数之间进行。 如果未对静态函数进行赋值,系统会自动赋予初值为零。 - 访问方式:对象名.静态数据成员
对象指针->对象名
下面来举个例子:
#include<string>
#include<iostream>
using namespace std;
class student{
private:
string name;
int number;
int exam;
static int count;
static int total;
public:
student(string s_na,int s_nu,int s_ex) ;
~student(){
};
void show();
void print();
};
int student::count=0;
int student::total=0;
student::student(string s_na ,int s_nu , int s_ex ){
name=s_na;
number=s_nu;
exam=s_ex;
++count;
total=total+exam;
}
void student::show(){
cout<<"学生人数:"<<count<<" 学生总体成绩:"<<total<<endl;
}
void student::print(){
cout<<"学生名称:"<<name<<" 学生学号:"<<number<<endl;
cout<<"***************************"<<endl;
}
int main(){
student s[3]={
student ("张三",1001,10),student ("李四",1002,20),student("王五",1003,30) };
s[2].show();
s[3].show();
return 0;
}
运行结果:
从这个结果可以看出:静态数据结构成员是共享的。而且所有对象最终输出的数据都是一样的,不会反映出程序运行时静态数据成员的变化过程。
2.静态成员函数
静态成员函数属于整个类,是该类所有对象共享的成员函数。静态成员函数的存在是为了处理静态数据结构。
- 格式
static 返回类型 静态成员函数名
- 调用方式 类名::静态成员函数名(实参表)
对象.静态成员函数 (实参表)
对象指针->静态成员函数名(实参表)
以下是基本使用方法:
#include<string>
#include<iostream>
using namespace std;
class student{
private:
string name;
int number;
int exam;
static int count;
static int total;
public:
student(string s_na,int s_nu,int s_ex) ;
~student(){
};
static void show();
void print();
};
int student::count=0;
int student::total=0;
student::student(string s_na ,int s_nu , int s_ex ){
name=s_na;
number=s_nu;
exam=s_ex;
++count;
total=total+exam;
}
void student::show(){
cout<<"学生人数:"<<count<<" 学生总体成绩:"<<total<<endl;
}
void student::print(){
cout<<"学生名称:"<<name<<" 学生学号:"<<number<<endl;
}
int main(){
student s[3]={
student ("张三",1001,10),student ("李四",1002,20),student("王五",1003,30) };
***********************
* s[3].show(); *
* student::show(); *
***********************
return 0;
}
需要注意的点已经用“*”标出。
我们在迫不得已使用静态成员函数来访问非静态成员时,我们需要用传参的方式来解决。
#include<string>
#include<iostream>
using namespace std;
class student{
private:
string name;
int number;
int exam;
static int count;
static int total;
public:
student(string s_na,int s_nu,int s_ex) ;
~student(){
};
static void show();
static void print(student &x );
};
int student::count=0;
int student::total=0;
student::student(string s_na ,int s_nu , int s_ex ){
name=s_na;
number=s_nu;
exam=s_ex;
++count;
total=total+exam;
}
void student::show(){
cout<<"学生人数:"<<count<<" 学生总体成绩:"<<total<<endl;
}
void student::print(student &x){
cout<<"学生名称:"<<x.name<<" 学生学号:"<<x.number<<endl;
cout<<"***************************"<<endl;
}
int main(){
student s[3]={
student ("张三",1001,10),student ("李四",1002,20),student("王五",1003,30) };
student::print(s[0]);
student::print(s[1]);
student::print(s[2]);
return 0;
}
静态数据成员在建立任何对象前就已经存在,所以可以在建立对象前就调用,这是普通函数不能做到的。