---- 整理自狄泰软件唐佐林老师课程
1. 成员变量回顾
- 通过对象名能够访问 public 成员变量
- 每个对象的成员变量都是专属的
- 成员变量不能在对象之间共享
2. 新的需求
- 统计在程序运行期间 某个类的对象数目
- 保证程序的安全性(不能使用全局变量)
- 随时可以获取当前对象的数目
2.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,根据下图可以知道原因:(每个对象有自己专属的 mCount 成员变量)
- 修改成全局变量的形式:
#include <stdio.h>
int gCount = 0; // 全局计数
class Test
{
private:
public:
Test() {
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.2 静态成员变量
- 在 C++ 中可以定义 静态成员变量
- 静态成员变量 属于整个类所有
- 静态成员变量的生命期不依赖于任何对象,生命期为程序运行期
- 可以通过 类名 直接访问 公有静态成员变量
- 所有对象 共享 类中的静态成员变量
- 可以通过 对象名 访问 公有静态成员变量
2.2.1 静态成员变量的特性
- 在定义时直接通过 static 关键字 修饰
- 静态成员变量 需要在 类外单独分配空间
- 静态成员变量在程序内部位于 全局数据区
语法规则:Type ClassName::VarName = value;
2.2.2 编程实验:静态成员变量的使用
#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;
}
2.3 小结
- 类中可以通过 static 关键字定义静态成员变量
- 静态成员变量隶属于类所有
- 每一个对象都可以访问静态成员变量
- 静态成员变量在全局数据区分配空间
- 静态成员变量的生命期为程序运行期