C++理解(3)–C++中类的静态成员变量
问题:
- 统计在程序运行期间某个类的对象的数目
- 保证程序的安全性(不能使用全局变量)
- 随时可以获取当前对象的数目
这里有个错误的示范:
#include <stdio.h>
class Test
{
private:
int mCount;
public:
Test() : mCount(0)
{
mCount++;
}
~Test()
{
--mCount;
}
int getCount()
{
return mCount;
}
};
Test gTest; //一个全局对象
int main()
{
Test t1; //局部对象
Test t2; //局部对象
printf("count = %d\n", gTest.getCount());
printf("count = %d\n", t1.getCount());
printf("count = %d\n", t2.getCount());
return 0;
}
结果:
count = 1
count = 1
count = 1
可以发现这个结果不是3。具体原因在于每一个对象都有自己的变量地址,但是变类量是共享的。因此他是不会累加的。
下面我们把变量定义为全局变量。
#include <stdio.h>
int gCount;
class Test
{
private:
int mCount;
public:
Test() : mCount(0)
{
gCount++;
}
~Test()
{
--gCount;
}
int getCount()
{
return gCount;
}
};
Test gTest; //一个全局对象
int main()
{
Test t1; //局部对象
Test t2; //局部对象
printf("count = %d\n", gTest.getCount());
printf("count = %d\n", t1.getCount());
printf("count = %d\n", t2.getCount());
return 0;
}
结果:
count = 3
count = 3
count = 3
结果是没错的。但是全局变量是不大安全的,容易被其他东西调用。因此使用静态变量static。
静态成员变量属于整个类所有
静态成员的生命周期不依赖于任何对象(程序包运行的整个周期)
可以通过类名直接访问共有静态成员变量
所有对象共享类的静态成员变量
可以通过对象名访问公有静态成员变量
编写新的代码:
#include <stdio.h>
class Test
{
private:
static int cCount;
public:
Test()
{
cCount++;
}
~Test()
{
--cCount;
}
int getCount()
{
return cCount;
}
};
int Test::cCount = 0; //这里是为什么?
Test gTest;
int main()
{
Test t1;
Test t2;
printf("count = %d\n", gTest.getCount());
printf("count = %d\n", t1.getCount());
printf("count = %d\n", t2.getCount());
Test* pt = new Test(); //发生了什么?
printf("count = %d\n", pt->getCount());
delete pt; //发生了什么?
printf("count = %d\n", gTest.getCount());
return 0;
}
结果:
count = 3
count = 3
count = 3
count = 4
count = 3
上述既满足统计对象的数目还有安全性。但是注意static是加载类的时候重载一次的。
由以上分析得出静态成员变量的几条特性:
在定义时直接通过static关键字修饰
静态成员变量需要在类外单独分配空间
静态成员变量在程序内部位于全局数据区(但是文件间无法共享)