欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、未完成的需求

  • 統(tǒng)計在程序運(yùn)行期間某個類的對象數(shù)目
  • 保證程序的安全性(不能使用全局變量)
  • 隨時可以獲取當(dāng)前對象的數(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; 可以認(rèn)為是意外導(dǎo)致這個賦值,這樣別人就會誤認(rèn)為這里面有 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é)果如下:

當(dāng)然,把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;
}

編譯器就會報錯:

這是因?yàn)殪o態(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)計在程序運(yùn)行期間某個類的對象數(shù)目 2.保證程序的安全性(不能使用全局變量) 3.隨時可以獲取當(dāng)前對象的數(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++中特殊類設(shè)計

    詳解C++中特殊類設(shè)計

    這篇文章主要為大家詳細(xì)介紹了C++中關(guān)于特殊類設(shè)計的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定的幫助,感興趣的可以了解一下
    2023-07-07
  • 深入理解C++函數(shù)棧幀

    深入理解C++函數(shù)棧幀

    本文主要介紹了C++函數(shù)棧幀,詳細(xì)的介紹了C++函數(shù)棧幀的概念以及使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn)

    C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn)

    這篇文章主要介紹了C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++ Boost MPI接口詳細(xì)講解

    C++ Boost MPI接口詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • ubuntu中打開終端的三種解決方法

    ubuntu中打開終端的三種解決方法

    本篇文章是對ubuntu中打開終端的三種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 老生常談C++getline使用方法

    老生常談C++getline使用方法

    下面小編就為大家?guī)硪黄仙U凜++getline使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++智能指針shared_ptr與weak_ptr的實(shí)現(xiàn)分析

    C++智能指針shared_ptr與weak_ptr的實(shí)現(xiàn)分析

    shared_ptr是一個標(biāo)準(zhǔn)的共享所有權(quán)的智能指針,允許多個指針指向同一個對象,定義在 memory 文件中,命名空間為 std,這篇文章主要介紹了C++ 中 shared_ptr weak_ptr,需要的朋友可以參考下
    2022-09-09
  • c語言中 基于隨機(jī)函數(shù)的使用詳解

    c語言中 基于隨機(jī)函數(shù)的使用詳解

    本篇文章對c語言的隨機(jī)函數(shù)進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 結(jié)構(gòu)體對齊的規(guī)則詳解及C++代碼驗(yàn)證

    結(jié)構(gòu)體對齊的規(guī)則詳解及C++代碼驗(yàn)證

    在c語言的結(jié)構(gòu)體里面一般會按照某種規(guī)則去進(jìn)行字節(jié)對齊。本文就來介紹一下如何實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解下
    2021-08-08
  • C++ OpenCV生成蒙太奇圖像的示例詳解

    C++ OpenCV生成蒙太奇圖像的示例詳解

    圖片的蒙太奇效果,一般稱為馬賽克圖。由很多小圖拼接成一個大圖。這篇文章主要為大家介紹如何利用C++ OpenCV實(shí)現(xiàn)生成蒙太奇圖像,感興趣的可以了解一下
    2022-01-01

最新評論