1、成员变量的回顾
- 通过对象名能够访问 public 的成员变量
- 每个对象的成员变量都是专属的
- 成员变量不能在对象之间共享
新的需求:
- 统计在程序运行期间某个类的对象数目
- 保证程序的安全性(不能使用全局变量)
- 随时可以获取当前对象的数目
程序:失败的解决方案1
#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;
}
分析:我们想要打印的结果是3个3,但是程序打印的结果却是3个1。很明显。这个程序不满足要求,那么,这个程序是哪里有问题呢?
问题在于我们定义了一个局部成员变量去++,每个对象都有自己专属的一套成员变量,而且初始化都会置为0,++后都会成为1,这就是问题所在。
失败的解决方案2:
#include <stdio.h>
int gCount = 0;
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;
}
分析:失败的原因在于我们在程序中最好不要用全局变量,因为它是不安全的
2、静态成员变量
- 在C++中可以定义静态成员变量
— 静态成员变量属于整个类所有
— 静态成员变量的生命期不依赖于任何对象(程序的运行周期)
— 可以通过类名直接访问 公有 静态成员变量(类名::公有静态成员变量名)
— 所有对象共享类的静态成员变量
— 可以通过对象名访问 公有 静态成员变量(对象名.公有静态成员变量名) - 语法规则:
Type ClassName::VarName = value
因为静态成员变量不隶属于任何对象,所以我们要在类的外部单独定义它,告诉编译器这个静态成员变量要在全局数据区分配空间。
#include <stdio.h>
class Test
{
private:
static int sCount;
public:
Test()
{
sCount++;
}
~Test()
{
--sCount;
}
int getCount()
{
return sCount;
}
};
int Test::sCount = 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", pt->getCount());
return 0;
}
用静态成员变量,使得这个程序就很完美了。
小结:
- 类中可以通过 static 关键字定义静态成员变量
- 静态成员变量隶属于类所有
- 每一个对象都可以访问 公有 静态成员变量
- 静态成员变量在全局数据区分配空间
- 静态成员变量的生命期为程序运行期