第25课 - 类的静态成员变量

第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\n", gTest.getCount());  // 1
35     printf("count = %d\n", t1.getCount());    // 1
36     printf("count = %d\n", 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\n", gTest.getCount());   // 3
34     printf("count = %d\n", t1.getCount());       // 3
35 
36     printf("count = %d\n", t2.getCount());  // 3
37 
38     Test* pt = new Test();
39 
40     printf("count = %d\n", pt->getCount()  // 4
41 
42     delete pt;    // 执行了析构函数
43 
44     printf("count = %d\n", gTest.getCount());   // 3
45 
46     return 0;
47 }
静态成员变量的使用

4. 小结

  (1)类中可以通过 static 关键字定义静态成员变量

  (2)静态成员变量隶属于类所有,不属于某个对象

  (3)每一个对象都可以访问静态成员变量

  (4)静态成员变量在全局数据区分配空间

  (5)静态成员变量的生命期为程序运行期

 

posted @ 2017-08-01 15:36  Hengs  阅读(299)  评论(0编辑  收藏  举报