1. 程式人生 > 實用技巧 >17 類的靜態成員變數

17 類的靜態成員變數

目錄

1 成員變量回顧

  • 通過物件名能夠訪問 public 成員變數
  • 每個物件的成員變數都是專屬的
  • 成員變數不能在物件之間共享

2 新的需求

  • 統計在程式執行期間某個類的物件數目
  • 保證程式的安全性(不能使用全域性變數)
  • 隨時可以獲取當前物件的數目

3 方案

  • 方案1

    • Demo

      #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;
      }
      
    • 編譯執行

      1
      1
      1
      
  • 方案2:靜態成員變數

4 靜態成員變數

  • 在 C++中可以定義靜態成員變數

    • 靜態成員變數屬於整個類
    • 靜態成員變數的生命週期不依賴於任何物件
    • 可以通過類名直接訪問公有靜態成員變數
    • 所有物件共享類的靜態成員變數
    • 可以通過物件名訪問公有靜態成員變數
  • 靜態成員變數的特性

    • 在定義時直接通過 static 關鍵字修飾
    • 靜態成員變數需要在類外單獨分配空間
    • 靜態成員變數在程式內部位於全域性資料區
  • 語法規則

    Type ClassName:VarName = value;

  • 示例:靜態成員變數的使用

    • Demo

      #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;
      }
      
    • 編譯執行

      count = 3
      count = 3
      count = 3
      count = 4
      count = 3