c++(5) 静态数据成员


静态数据成员

概念:为了实现一个类的多个对象的数据共享,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;
}

在这里插入图片描述
静态数据成员在建立任何对象前就已经存在,所以可以在建立对象前就调用,这是普通函数不能做到的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值