静态成员
引入目的:实现一个类的不同对象之间数据和函数共享
谁共享:本类所有对象。
- 静态数据成员
- 用关键字static声明
- 该类的所有对象维护该成员的同一个拷贝
- 必须在类外定义和初始化,用(::)来指明所属的类。
- 静态成员函数
- 类外代码可以使用类名和作用域操作符来调用公有静态成员函数。
- 静态成员函数只能引用属于该类的静态数据成员或静态成员函数。访问非静态数据成员,必须通过参数传递方式得到对象名,通过对象名访问。
1. 静态数据成员
为何需要静态数据成员?
例 静态数据成员的引例
#include<iostream.h>
#include<string.h>
class Student {
public:
Student(char *name1,char *stu_no1,float score1);
~Student();
void show(); // 输出姓名、 学号和成绩
void show_count_sum_ave(); // 输出学生人数
private:
char *name; // 学生姓名
char *stu_no; // 学生学号
float score; // 学生成绩
int count;
float sum;
float ave;
};
Student::Student(char *name1,char *stu_no1,float score1 )
{
name=new char[strlen(name1)+1];
strcpy(name,name1);
stu_no=new char[strlen(stu_no1)+1];
strcpy(stu_no,stu_no1);
score=score1;
++count; // 累加学生人数
sum=sum+score; // 累加总成绩
ave=sum/count; // 计算平均成绩
}
Student::~Student()
{
delete []name;
delete []stu_no;
--count;
sum=sum-score;
}
void Student::show()
{
cout<<"\n name: "<<name;
cout<<"\n stu_no: "<<stu_no;
cout<<"\n score: "<<score;
}
void Student::show_count_sum_ave()
{
cout<<"\n count: "<<count;
cout<<"\n sum: "<<sum;
cout<<"\n ave: "<<ave;
}
void main()
{
Student stu1("Liming","990201",90);
stu1.show();
stu1.show_count_sum_ave();
Student stu2("Zhanghao","990202",85);
stu2.show();
stu2.show_count_sum_ave();
}
如何定义静态数据成员?
在一个类中,若将一个数据成员说明为static,这种成员称为静态数据成员。
静态数据成员特点?
- 与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据的拷贝。从而实现了同一个类的不同对象之间的数据共享。
- 它不因对象的建立而产生,也不因对象的析构而删除。它是类定义的一部分,所以使用静态数据成员不会破坏类的隐蔽性。
- 在类的声明中只能声明静态数据成员的存在。由于类的声明是抽象的,静态数据成员的初始化需要在类的外部进行, 通过类名对它进行访问。
静态数据成员初始化的格式
<数据类型><类名>∷<静态数据成员名>=<值>;
- 初始化时不加该成员的访问权限控制符private,public等。
- 初始化时使用作用域运算符来标明它所属的类,因此,静态数据成员是类的成员,而不是对象的成员。
引用静态数据成员时,采用如下格式:
<类名>∷<静态成员名>
- 如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。
例3.15 静态数据成员的使用引例
#include<iostream.h>
#include<string.h>
class Student {
public:
Student(char *name1,char *stu_no1,float score1);
~Student();
void show(); // 输出姓名、 学号和成绩
void show_count_sum_ave(); // 输出学生人数
private:
char *name; // 学生姓名
char *stu_no; // 学生学号
float score; // 学生成绩
static int count; // 静态数据成员,统计学生人数
static float sum; // 静态数据成员,统计总成绩
static float ave; // 静态数据成员,统计平均成绩
};
Student::Student(char *name1,char *stu_no1,float score1 )
{
name=new char[strlen(name1)+1];
strcpy(name,name1);
stu_no=new char[strlen(stu_no1)+1];
strcpy(stu_no,stu_no1);
score=score1;
++count; // 累加学生人数
sum=sum+score; // 累加总成绩
ave=sum/count; // 计算平均成绩
}
Student::~Student()
{
delete []name;
delete []stu_no;
--count;
sum=sum-score;
}
void Student::show()
{
cout<<"\n name: "<<name;
cout<<"\n stu_no: "<<stu_no;
cout<<"\n score: "<<score;
}
void Student::show_count_sum_ave()
{
cout<<"\n count: "<<count; // 输出静态数据成员count
cout<<"\n sum: "<<sum; // 输出静态数据成员sum
cout<<"\n ave: "<<ave; // 输出静态数据成员ave
}
int Student::count=0; // 静态数员count初始化
float Student::sum=0.0;