第25课 - 类的静态成员变量
1. 成员变量的回顾
(1)通过对象名能够访问 public 成员变量
(2)每个对象的成员变量都是专属的,成员变量不能在对象之间共享
这么看,如果多个对象想操作同一个数据,从目前来看只能使用全局变量(每个对象都可以操作全局作用域的全局变量),但是这样存在安全隐患,在现代软件开发中不推荐这种方式。
那么,有没有其它更好的方式呢?下面我们就引入了类的静态成员变量的概念。
2. 新的需求
(1)统计在程序运行期间某个类的对象数目
(2)保证程序的安全性 ==> 不能使用全局变量。由于全局变量在程序的任何地方都可能修改,因此现代的软件开发中不推荐使用全局变量。
(3)随时可以获取当前对象的数目
1 // 由于对象的成员变量都是专属的,成员变量不能在对象之间共享 2 // 因此下面这种尝试无法统计某个类的对象数目 3 // 在程序开发中不可能一次就成功,需要进行多次的尝试和优化 4 5 #include <stdio.h> 6 7 class Test 8 { 9 private: 10 int mCount; 11 public: 12 Test() : mCount(0) 13 { 14 mCount++; 15 } 16 ~Test() 17 { 18 --mCount; 19 } 20 int getCount() 21 { 22 return mCount; 23 } 24 }; 25 26 27 Test gTest; 28 29 int main() 30 { 31 Test t1; 32 Test t2; 33 34 printf("count = %d ", gTest.getCount()); // 1 35 printf("count = %d ", t1.getCount()); // 1 36 printf("count = %d ", t2.getCount()); // 1 37 38 return 0; 39 }
3. 静态成员变量
3.1 在C++中可以定义静态成员变量
(1)静态成员变量隶属于整个类所有
(2)静态成员变量的生命周期不依赖于任何对象,静态成员变量的生命期如同全局变量一样,是程序的运行周期 【静态成员变量的生命周期和全局变量的生命周期相同】
(3)可以通过类名直接访问公有静态成员变量 【类名 :: 静态成员变量名(Class_name :: static_member)】
(4)所有对象共享类的静态成员变量
(5)可以通过对象名访问公有静态成员变量
3.2 静态成员变量的特性
(1)在定义时直接通过 static 关键字修饰
(2)静态成员变量不占用对象的空间,需要在类外单独分配空间 【使用 sizeof() 打印类的大小,可以验证这一点(空类也占用一个字节)】
(3)静态成员变量在程序内部位于全局数据区 【全局变量、static修饰的局部变量、类的静态成员变量这三者都在全局数据区】
3.3 语法规则
Type ClassName::VarName = value; // 这里前面不用加 static
1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 static int cCount; 7 public: 8 Test() 9 { 10 cCount++; 11 } 12 ~Test() 13 { 14 --cCount; 15 } 16 int getCount() 17 { 18 return cCount; 19 } 20 }; 21 22 23 int Test::cCount = 0; 24 25 Test gTest; 26 27 int main() 28 { 29 Test t1; 30 31 Test t2; 32 33 printf("count = %d ", gTest.getCount()); // 3 34 printf("count = %d ", t1.getCount()); // 3 35 36 printf("count = %d ", t2.getCount()); // 3 37 38 Test* pt = new Test(); 39 40 printf("count = %d ", pt->getCount() // 4 41 42 delete pt; // 执行了析构函数 43 44 printf("count = %d ", gTest.getCount()); // 3 45 46 return 0; 47 }
4. 小结
(1)类中可以通过 static 关键字定义静态成员变量
(2)静态成员变量隶属于类所有,不属于某个对象
(3)每一个对象都可以访问静态成员变量
(4)静态成员变量在全局数据区分配空间
(5)静态成员变量的生命期为程序运行期