最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年04月23日 10:10:15   作者:清風自在?流水潺潺  
與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對象,也就無法對一個對象中的非靜態(tài)成員進行默認訪問

一、未完成的需求

  • 統(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 應該輸出為 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; 可以認為是意外導致這個賦值,這樣別人就會誤認為這里面有 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); 也是可以的哈,對應于前面講的可以通過類名直接訪問公有靜態(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ù)
所有對象共享YesYes
隱含 this 指針NoYes
訪問普通成員變量(函數(shù))NoYes
訪問靜態(tài)成員變量(函數(shù))YesYes
通過類名直接調(diào)用YesNo
通過對象名直接調(diào)用YesYes

所以,滿足 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ù))

到此這篇關(guān)于C++分析講解類的靜態(tài)成員函數(shù)如何使用的文章就介紹到這了,更多相關(guān)C++靜態(tài)成員函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++嵌套類與局部類詳細解析

    C++嵌套類與局部類詳細解析

    從作用域的角度看,嵌套類被隱藏在外圍類之中,該類名只能在外圍類中使用。如果在外圍類之外的作用域使用該類名時,需要加名字限定
    2013-09-09
  • C++使用tinyxml庫處理XML文件

    C++使用tinyxml庫處理XML文件

    TinyXML是一個開源的解析XML的解析庫,能夠用于C++,能夠在Windows或Linux中編譯,這個解析庫的模型通過解析XML文件,然后在內(nèi)存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹,本文為大家介紹的是使用tinyxml庫處理XML文件,需要的可以參考一下
    2023-07-07
  • C++核心編程之類和對象詳解

    C++核心編程之類和對象詳解

    這篇文章主要介紹了C++編程進階之類和對象用法等相關(guān)使用技巧,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C語言模擬實現(xiàn)通訊錄程序過程

    C語言模擬實現(xiàn)通訊錄程序過程

    這篇文章主要介紹了C語言模擬實現(xiàn)通訊錄程序過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-02-02
  • 詳解C++函數(shù)類型與重載函數(shù)

    詳解C++函數(shù)類型與重載函數(shù)

    這篇文章主要為大家介紹了C++函數(shù)類型與重載函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • OpenCV實現(xiàn)亂序碎片復原

    OpenCV實現(xiàn)亂序碎片復原

    這篇文章主要介紹了通過OpenCV 直方圖相似度對比,實現(xiàn)將4張打亂順序的碎片拼接復原并展示原圖。文中的示例代碼講解詳細,需要的朋友可以學習一下
    2021-12-12
  • VS2019開發(fā)Linux C++程序的實現(xiàn)步驟

    VS2019開發(fā)Linux C++程序的實現(xiàn)步驟

    由于很多unix特有的函數(shù)無法在Windows上使用,而Vim又用的不太順手,突然想到最初用vs的時候有一個基于Linux的C++開發(fā)。本文就來介紹一下,感興趣的可以了解一下
    2021-07-07
  • 用c語言實現(xiàn)一個電話薄(附完整代碼)

    用c語言實現(xiàn)一個電話薄(附完整代碼)

    大家好,本篇文章主要講的是用c語言實現(xiàn)一個電話?。ǜ酵暾a),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 利用ace的ACE_Task等類實現(xiàn)線程池的方法詳解

    利用ace的ACE_Task等類實現(xiàn)線程池的方法詳解

    本篇文章是對利用ace的ACE_Task等類實現(xiàn)線程池的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++保存HBITMAP為位圖文件的實現(xiàn)方法

    C++保存HBITMAP為位圖文件的實現(xiàn)方法

    這篇文章主要介紹了C++保存HBITMAP為位圖文件的實現(xiàn)方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-01-01

最新評論

德庆县| 四川省| 红安县| 百色市| 招远市| 宝清县| 广东省| 霞浦县| 灵丘县| 汤原县| 枝江市| 防城港市| 白城市| 福泉市| 家居| 静海县| 霍林郭勒市| 金湖县| 嘉荫县| 长宁区| 永年县| 凤山市| 阿拉善盟| 乌兰察布市| 浦城县| 朝阳区| 绵阳市| 漯河市| 黑山县| 万源市| 三门县| 陇南市| 三穗县| 肥城市| 新竹市| 镇原县| 灌阳县| 乌恰县| 炎陵县| 合阳县| 通城县|