1、静态成员:
1.1、说明
静态成员包括静态数据和静态成员函数。
(1)、静态数据成员的定义与普通数据成员相似,但要在前面加static关键字。
(2)、静态变量一定要进行初始化:一般初始化位置在main函数之前、类声明之后。
1.2、格式
初始化格式:
数据类型 类名::静态数据成员名=初始值;
示例如下:
#include<iostream>
using namespace std;
class score{
public:
static int number;//静态数据成员
...
};
...
int score::number=0; //对静态数据成员初始化
(3)、静态数据成员属于类,因此可以使用”类名::”访问静态的数据成员。
访问格式:
类名::静态数据成员名
(4)、静态数据成员与静态变量一样,是在编译时创建并初始化。在该类的任何对象被建立之前就存在。
公有的静态数据成员可以在对象定义之前被访问。
对象定义后,公有的静态数据成员也可以通过对象进行访问。
用对象访问静态数据成员的格式如下:
对象名.静态数据成员名;
对象指针->静态数据成员名;
示例如下:
#include<iostream>
using namespace std;
class score{
public:
static int number; //定义静态成员
};
int score::number=0; //对静态数据成员初始化
int main()
{
score::number=10; //公有静态数据成员可以在对象定义之前被访问
score ob,*p;
p=&ob;
cout<<"ob.number:"<<ob.number<<endl; //通过对象访问公有静态数据成员number
cout<<"score::number:"<<score::number<<endl; //通过类名访问公有静态数据成员number
cout<<"p->number"<<p->number<<endl; //通过对象指针公有静态数据成员number
return 0;
}
运行结果如下:
ob.number:10
score::number:10
p->number10
(5)、在类外,私有的静态数据成员不能被直接访问,必须通过公有的成员函数访问。
(6)、C++支持静态数据成员的一个主要原因是可以不必使用全局变量。
2、静态成员函数
2.1、说明
静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,而静态成员函数没有this指针。
一般而言,静态成员函数不访问类中的非静态成员。若确实需要访问非静态数据成员,静态成员函数只能通过对象名(或对象指针、对象引用)访问该对象的非静态成员。
2.2、格式
定义静态成员函数的格式如下:
static 返回类型 静态成员函数名();
调用公有静态成员函数的一般格式为:
类名::静态成员函数名()
对象.静态成员函数名()
对象指针->静态成员函数名()
示例代码如下:
#include <iostream>
using namespace std;
class score{
public: //公有
score(int a,int b); //公有成员函数
static void showscore(); //静态成员函数
private: //私有
int mid_exam; //私有成员函数
int fin_exam; //私有成员函数
static int count; //统计数量
static double sum; //统计累加值
static double ave; //统计平均值
};
score::score(int a,int b)
{
count++; //累加数量
mid_exam=a;
fin_exam=b;
sum+=fin_exam; //累加值
ave=sum/count; //平均值
}
void score::showscore()
{
cout<<"人数"<<count<<endl;
cout<<"累加分数"<<sum<<endl;
cout<<"平均成绩"<<ave<<endl;
}
int score::count=0; //初始化
double score::sum=0.0;
double score::ave=0.0;
int main()
{
score rec[3]={ //定义对象数组
score(70,71),
score(80,81),
score(90,91)
};
rec[3].showscore(); //用对象名访问
score::showscore(); //用类名访问
return 0;
}
运行结果如下:
人数3
累加分数243
平均成绩81
人数3
累加分数243
平均成绩81
(1)、一般情况下,静态函数成员主要用来访问静态数据成员。当它与静态数据成员一起使用时,达到了对同一个类中对象之间共享数据的目的。
(2)、私有静态成员函数不能被类外部的函数和对象访问。
(3)、可以用静态成员函数在建立任何一个对象之前调用静态成员函数,以处理静态数据成员。
(4)、静态成员函数是类的一部分,而不是对象的一部分。
如果要在类外调用公有的静态成员函数,使用如下格式较好:
类名::静态成员函数名()