類的靜態成員變量和靜態成員函數


1. 靜態成員變量

先來回顧一下普通成員變量

  • 通過對象名能夠訪問public成員變量
  • 每個對象的普通成員變量都是專屬的,不能在對象之間共享

在C++中還可以定義靜態成員變量

  • 靜態成員變量屬於整個類所有,所有對象共享類的靜態成員變量
  • 靜態成員變量的生命周期不依賴於任何對象
  • 可以通過類名對象名訪問public靜態成員變量

靜態成員變量的定義

  • 靜態成員變量在類的內部聲明,聲明時直接通過static關鍵字修飾
  • 靜態成員變量在類的外部定義與初始化,語法規則為Type ClassName::VarName = value;
  • 靜態成員變量不占用類的大小,而是在類外(全局數據區)單獨分配空間
#include <stdio.h>

class Test
{
private:
    static int c;
};

int Test::c = 0;

2. 靜態成員函數

與靜態成員變量類似,靜態成員函數是類中特殊的成員函數

  • 靜態成員函數屬於整個類所有
  • 可以通過類名對象名訪問public靜態成員函數
  • 靜態成員函數只能訪問靜態成員變量和靜態成員函數
class Demo
{
public:
    static void StaticFunc(const char *s)
    {
        printf("StaticFunc: %s\n", s);
    }

    static void StaticSetI(Demo &d, int v);
};

void Demo::StaticSetI(Demo &d, int v)
{
    d.i = v;
}

靜態成員函數 VS 普通成員函數

3. 實戰練習

實現如下需求

  • 統計在程序運行期間某個類的對象數目
  • 不能使用全局變量
  • 隨時可以獲取當前對象的數目
#include <stdio.h>

class Test
{
private:
    static int cCount;
public:
    Test();
    ~Test();
    static int GetCount();
};

int Test::cCount = 0;

Test::Test()
{
    cCount++;
}

Test::~Test()
{
    --cCount;
}

int Test::GetCount()
{
    return cCount;
}

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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM