zoukankan      html  css  js  c++  java
  • 第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
    ", 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)静态成员变量的生命期为程序运行期

  • 相关阅读:
    学习日志---4.5.6
    学习日志---3
    学习日志---2
    学习日志---1
    阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章
    淘宝网的质量属性的六个常见属性场景
    虚继承 private virtual class
    C++ 类中什么时候需要一个operator<
    C++ 中关于 输出的重定向
    C++ 元编程 学习二
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/7268862.html
Copyright © 2011-2022 走看看