日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

C++分析講解類的靜態(tài)成員函數(shù)如何使用_C 語言

作者:清風(fēng)自在?流水潺潺 ? 更新時間: 2022-06-21 編程語言

一、未完成的需求

  • 統(tǒng)計在程序運行期間某個類的對象數(shù)目
  • 保證程序的安全性(不能使用全局變量)
  • 隨時可以獲取當前對象的數(shù)目

在C++分析講解類的靜態(tài)成員變量是什么中每次打印對象的個數(shù)時,都需要依賴于一個對象名,下面看一個代碼:

#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", gTest.getCount);
    return 0;
}

按理說 count 應(yīng)該輸出為 0,但是 gTest 對象沒有定義,所以編譯就會報錯:

有沒有什么解決辦法呢?下面再看一段代碼:

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

輸出結(jié)果如下,Test::cCount = 1000; 可以認為是意外導(dǎo)致這個賦值,這樣別人就會誤認為這里面有 1000 個對象,這是不對的。

直接通過類名訪問成員變量也是不可取的,安全性會打折扣。

那到底該怎么做呢?且看下面。

二、問題分析

需要做的事情

  • 不依賴對象就可以訪問靜態(tài)成員變量
  • 必須保證靜態(tài)成員變量的安全性
  • 方便快捷的獲取靜態(tài)成員變量的值

三、靜態(tài)成員函數(shù)

在 C++ 中可以定義靜態(tài)成員函數(shù)

  • 靜態(tài)成員函數(shù)是類中特殊的成員函數(shù)
  • 靜態(tài)成員函數(shù)屬于整個類所有
  • 可以通過類名直接訪問公有靜態(tài)成員函數(shù)
  • 可以通過對象名訪問公有靜態(tài)成員函數(shù)

靜態(tài)成員函數(shù)的定義

直接通過 static 關(guān)鍵字修飾成員函數(shù)

下面看一個靜態(tài)成員函數(shù)示例:

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

輸出結(jié)果如下:

當然,把Demo::StaticSetI(d, 10); 換成 d.StaticSetI(d, 10); 也是可以的哈,對應(yīng)于前面講的可以通過類名直接訪問公有靜態(tài)成員函數(shù),也可以通過對象名訪問公有靜態(tài)成員函數(shù)。

如果把void Demo::StaticSetI(Demo& d, int v) 這里變成:

void Demo::StaticSetI(int v)
{
    i = v;
}

編譯器就會報錯:

這是因為靜態(tài)成員函數(shù)不能直接訪問成員變量,可以通過對象名訪問公有靜態(tài)成員函數(shù)。

靜態(tài)成員函數(shù) vs 普通成員函數(shù)

? 靜態(tài)成員函數(shù) 普通成員函數(shù)
所有對象共享 Yes Yes
隱含 this 指針 No Yes
訪問普通成員變量(函數(shù)) No Yes
訪問靜態(tài)成員變量(函數(shù)) Yes Yes
通過類名直接調(diào)用 Yes No
通過對象名直接調(diào)用 Yes Yes

所以,滿足 1. 統(tǒng)計在程序運行期間某個類的對象數(shù)目 2.保證程序的安全性(不能使用全局變量) 3.隨時可以獲取當前對象的數(shù)目的最終解決方案如下:

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

輸出結(jié)果如下:

四、小結(jié)

  • 靜態(tài)成員函數(shù)是類中特殊的成員
  • 函數(shù)靜態(tài)成員函數(shù)沒有隱藏的 this 參數(shù)
  • 靜態(tài)成員函數(shù)可以通過類名直接訪問
  • 靜態(tài)成員函數(shù)只能直接訪問靜態(tài)成員變量(函數(shù))

原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/124260491

欄目分類
最近更新