在C++语言中,静态成员可以实现类的多个对象之间的数据共享。静态成员不是属于某个对象的,而是属于类的。它是某个类的所有对象共有的。静态成员有两种:静态数据成员和静态成员函数。
静态数据成员
静态数据成员作为类的一种成员,它被类的所有对象所共享,而不是属于某个对象的。在存储上只需存储一处,就可以供所有的对象使用。静态数据成员由于是公有的,因此它的值对每个对象都是一样的。静态数据成员的值可以被更新。只要静态成员的值更新一次,所有对象的该静态成员都被更新,并且值都是相同的。
静态数据成员的定义或说明:
静态数据成员的定义或说明在类体内,在该成员名的类型说明符前边加关键字static。
静态数据成员的初始化:
静态数据成员被定以后,必须对它进行初始化。初始化在类体外进行,一般放在该类的实现部分最合适,也可以放在其他位置,比如主函数前面。静态数据成员的初始化与该类的构造函数无关,格式为: <数据类型> <类名> :: <静态数据成员名>=<初始值>; 作用域运算符“::”用来说明静态数据成员所属的类,在初始化时,不加关键字static,以防止与静态对象(描述某个类的对象的作用域)相混淆。
定义静态数据成员时,可根据需要规定它的访问权限控制符,静态数据成员是静态生存期,只对它进行一次初始化,将始终保持其值,直到下次改变为止。
静态数据成员引用的格式:<类名> :: <静态数据成员名>
由于静态数据成员时一种类的数据成员,因此使用对象引用(<对象名> . <静态数据成员名>)也是可以的,但是通常使用类名加作用域运算符“::”来引用。
分析下面的程序;
<span style="font-size:18px;">#include <iostream.h>
class Myclass
{
public:
Myclass(int a,int b,int c);//带三个参数构造函数
void GetNumber();//一般的成员函数
int GetSum(Myclass m);//参数为对象的一般成员函数
private:
int A,B,C;
static int Sum;//类内定义的静态数据成员
};
int Myclass::Sum(0);//类体外对静态数据成员赋值为0
Myclass::Myclass(int a,int b,int c)//构造函数的函数体
{
A=a;
B=b;
C=c;
Sum+=A+B+C;//构造函数引用静态数据成员
}
void Myclass::GetNumber()
{
cout<<A<<","<<B<<","<<C<<endl;
}
int Myclass::GetSum(Myclass m)
{
return Myclass::Sum;//通过类来引用静态数据成员
}
void main()
{
Myclass M(3,4,5),N(5,6,7);
N.GetNumber();//在主函数中对成员函数的调用只能通过对象成员的引用方法
cout<<M.GetSum(M)<<";"<<M.GetSum(N)<<endl;
}</span>
分析:(1)定义的对象M和N调用构造函数来实现初始化
(2)成员函数void Myclass::GetNumber()被调用实现对对象N的输出即为5;6;7
(3)调用成员函数int Myclass::GetSum(Myclass m)实现对象M和N中的静态数据成员的返回。
静态成员函数
静态成员函数的定义和说明与静态数据成员一样,在成员函数名前的类型说明符前加关键字static。函数的实现可以再类体内,也可以在类体外,与一般的成员函数相同。
在静态成员函数的实现中,可以直接引用静态成员。但不能直接引用非静态成员。如果要引用非静态成员,可以通过对象来实现。对静态成员函数的引用格式为:<类名> :: <静态成员函数> ( <参数表> )。有时也用对象来引用静态成员函数的格式为:<对象名> . <静态成员函数名>( <参数表> )
分析程序:
#include <iostream.h>
class M
{
public:
M(int a)//带有一个参数构造函数并且函数体写在类体内
{
A=a;
B+=a;
}
static void fun(M m);//定义的带有一个参数为对象静态成员函数
private:
int A;
static int B;//定义的一个静态数据成员
};
void M::fun(M m)//静态成员函数的函数体
{
cout<<"A="<<m.A<<endl;
cout<<"B="<<B<<endl;
}
int M::B=10;//对静态数据成员的初始化
void main()
{
M P(6),Q(8);
M::fun(p);//使用类名来引用静态成员函数
Q.fun(Q);//使用对象成员来引用静态成员函数
}
分析:(1)先调用构造函数来实现对象P和Q的初始化
(2)然后引用函数静态成员函数实现对数值的输出