18 类的静态成员函数

1 未完成的需求

  • 统计在程序运行期间某个类的对象数目

  • 保证程序的安全性(不能使用全局变量)

  • 随时可以获取当前对象的数目(Failure)=> 必须借用一个对象才能调用“获取当前对象的数目”的函数

  • 示例:解决方案的尝试

    • Demo

      #include <stdio.h>
      
      class Test
      {
      public:
          static int cCount;
      public:
          Test()
          {
              cCount++;
          }
          ~Test()
          {
              --cCount;
          }
          int getCount()
          {
              return cCount;
          }
      };
      
      int Test::cCount = 0;
      
      int main()
      {
          printf("count = %d\n", Test::cCount);
          
          Test::cCount = 1000;  //误赋值
          
          printf("count = %d\n", Test::cCount);
          
          return 0;
      }
      
    • 编译

      count = 0
      count = 1000
      

2 分析

  • 需要什么?
    • 不依赖对象就可以访问静态成员变量
    • 必须保证静态成员变量的安全性
    • 方便快捷地获取静态成员变量的值

3 静态成员函数

  • 在 C++ 中可以定义静态成员函数

    • 静态成员函数是类中特殊的成员函数
    • 静态成员函数属于整个类所有
    • 可以通过类名直接访问公有静态成员函数
    • 可以通过对象名访问公有静态成员函数
  • 静态成员函数的定义

    • 直接通过 static 关键字修饰成员函数
    class Test
    {
    public:
        static void func1(){}
        static int fcun2();
    };
    
    int Test::func2(){
        return 0;
    }
    
  • 示例:静态成员函数使用

    • Demo

      #include <stdio.h>
      
      class Demo
      {
      private:
          int i;
      public:
          int getI();
          static void StaticFunc(const char* s);  //静态成员函数
          static void StaticSetI(Demo& d, int v);  //静态成员函数
      };
      
      int Demo::getI()
      {
          return i;
      }
      
      void Demo::StaticFunc(const char* s)
      {
          printf("StaticFunc: %s\n", s);
      }
      
      void Demo::StaticSetI(Demo& d, int v)
      {
          d.i = v;
      }
      
      int main()
      {
          Demo::StaticFunc("main Begin...");
          
          Demo d;
          
          Demo::StaticSetI(d, 10);
          
          printf("d.i = %d\n", d.getI());
          
          Demo::StaticFunc("main End...");
          
          return 0;
      }
      
    • 编译运行

      main Begin...
      d.i = 10
      main End...
      
  • 静态成员函数 VS 普通成员函数

    静态成员函数 普通成员函数
    所有对象共享 Yes Yes
    隐含 this 指针 No Yes
    访问普通成员变量(函数) No Yes
    访问静态成员变量(函数) Yes Yes
    通过类名直接调用 Yes No
    通过对象名直接调用 Yes Yes
  • 示例:解决方案

    • Demo

      #include <stdio.h>
      
      class Test
      {
      private:
          static int cCount;
      public:
          Test()
          {
              cCount++;
          }
          ~Test()
          {
              --cCount;
          }
          static int GetCount()
          {
              return cCount;
          }
      };
      
      int Test::cCount = 0;
      
      int main()
      {
          printf("count = %d\n", Test::GetCount());
          
          Test t1;
          Test t2;
          
          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", Test::GetCount());
          
          return 0;
      }
      
    • 编译运行

      count = 0
      count = 2
      count = 2
      count = 3
      count = 2
      
posted @ 2020-09-23 21:36  nxgy  阅读(101)  评论(0编辑  收藏  举报