- 类中的静态成员
在定义一个类时,可以使用static关键字指定静态成员,包括静态数据成员和静态成员函数。
我们都知道,一个类的两个对象会拥有不同的内存空间来存储两个对象中的数据成员,每个对象的同名数据成员互不干扰,就像两个结构体一样。而静态成员则不同,该类的所有对象的静态数据成员都共用一个存储空间,即静态数据成员被类的所有对象共享。也就是不管定义几个类的对象,这个静态成员都只有一个内存空间。其实有点类似全局变量的意思有没有?
在类中的定义,我们只会声明,不会进行初始化,静态数据成员也是一样的,就和成员函数一样,我们在类外进行初始化。那我不初始化行不行呢,我只在定义的时候再初始化?当然是不行的,我们前面说过了静态成员只有一个内存空间,因此我们必须首先进行初始化,给它事先分配一个内存空间,它的初始化形式和成员函数类似的
数据类型 类名::静态数据成员 = 初始值。
再次声明:必须对类的静态数据成员进行初始化。
静态成员函数是被一个类中所有的对象共享的成员函数,并不属于哪个特定的对象,因此,一般只用于访问静态数据成员或者全局变量,不能访问局部变量,即便需要调用函数,也只能调用其他的静态成员函数。
Class CTest
{
Private:
Static int m; //声明了静态的数据成员
Int n;
Public:
CTest(){
n=0;
}
Static int get() //定义了静态初始化函数,只能使用变量m,不能使用n
{
Return m;
}
Static void grow()
{
m++;
}
Void add()
{
n++;
}
Void show(){
Printf(“%d%d\n”,m,n);
}
}
int CTest::m = 0;//初始化静态数据成员
Void main()
{
CTest a,b;
For(int i=0;i<5;i++)
{
a.grow();
b.add();
}
b.grow();
b.add();
a.show();
b.Show();
}
结果为 6 5
6 1
从程序可以看到m为共享的,我们知道grow为静态成员函数,但是使用了.的操作符,这样也是正确的,但是为了提高程序的可读性,让读者一眼便看到这是个静态成员函数,我们最好使用类名形式,而不使用对象名。即CTest::grow();现在终于知道为什么程序中很多都是::这个符号了把,其实他们都是定义的静态成员函数。因此上面的函数可以改写为:
Void main()
{
CTest a,b;
For(int i=0;i<5;i++)
{
CTest::grow();
b.add();
}
CTest::grow();
b.add();
a.show();
b.Show();
}
同样的对于静态数据成员,如果是公有类型的,可以再类外直接进行访问:
比如:
CTest::m +=3;
但是千万不能这么访问非静态成员,不然要出错的。