91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

類的靜態成員變量及函數(二十)

發布時間:2020-07-13 01:45:38 來源:網絡 閱讀:544 作者:上帝之子521 欄目:編程語言

        我們正常情況下能通過對象名來訪問 public 成員變量,每個對象的成員變量都是專屬的,成員變量不能在對象之間共享的。我們現在學了這么長時間的 C++,現在又有了一個新的需求a> 同級在程序運行期間某個類的對象數目;b> 保證程序的安全性(不能使用全局變量);c> 隨時可以獲取當前對象的數目。

        我們首先想到的是定義一個私有成員變量,然后在構造函數中進行 ++ 操作,在析構函數中進行 -- 操作。我們試著寫下程序

#include <stdio.h>

class Test
{
private:
    int mCount;
public:
    Test()
    {
        mCount++;
    }
    ~Test()
    {
        --mCount;
    }
    int getCount()
    {
        return mCount;
    }
};

Test gTest;

int main()
{
    Test t1;
    Test t2;
    
    printf("gTest.getCount() = %d\n", gTest.getCount());
    printf("t1.getCount() = %d\n", t1.getCount());
    printf("t2.getCount() = %d\n", t2.getCount());
    
    return 0;
}

        我們先來試著編譯下

類的靜態成員變量及函數(二十)

        那么它打印出來的是都是隨機值,我們在構造函數中的初始化列表中進行初始化為0

類的靜態成員變量及函數(二十)

        我們看到打印出三個 1,并不是我們所期望的三個 3。這是因為在每次新生成對象調用構造函數時,它都會初始化。那么我們試著定義一個全局變量來試試呢,int gMount = 0

類的靜態成員變量及函數(二十)

        顯然它是可以滿足的,但是我們的客戶需求里有一條便是不準使用全局變量。所以這個只得放棄。這時我們便想到了靜態成員變量,下來我們來講講靜態成員變量。在 C++ 中可以定義靜態成員變量:a> 靜態成員變量屬于整個類所有;b> 靜態成員變量的聲明周期不依賴于任何對象;c> 可以通過類名直接訪問共有靜態成員變量;d> 所有對象共享類的靜態成員變量;e> 可以通過對象名訪問公有靜態成員變量。靜態成員變量的1、在定義時直接通過 static 關鍵字修飾;2、靜態成員變量需要在類外單獨分配空間;3、靜態成員變量在程序內部位于全局數據區。它的語法規則是:Type ClassName::VarName = value;

        下來我們使用靜態成員變量來看看是否會滿足要求,程序如下

#include <stdio.h>

class Test
{
private:
    static int mCount;
public:
    Test() : mCount(0)
    {
        mCount++;
    }
    ~Test()
    {
        --mCount;
    }
    int getCount()
    {
        return mCount;
    }
};

Test gTest;

int main()
{
    Test t1;
    Test t2;
    
    printf("gTest.getCount() = %d\n", gTest.getCount());
    printf("t1.getCount() = %d\n", t1.getCount());
    printf("t2.getCount() = %d\n", t2.getCount());
    
    return 0;
}

        我們編譯下看看

類的靜態成員變量及函數(二十)

        我們看到報錯了,要在全局數據區進行初始化,我們加上 int Test::mCount = 0;并且去掉構造函數中初始化列表的初始化,再次編譯

類的靜態成員變量及函數(二十)

        我們看到已經實現了哈,那么我們是否可以放心的交給用戶了哈。仔細看下,我們的程序沒完成第三條需求,隨時可以獲取當前對象的數目。如果我們沒有定義對象的話,那么我們這個程序是否還可以完成功能呢?肯定不行了。

        那么我們嘗試將 mCount 屬性改為 public 呢,看看是否可以滿足,程序如下

#include <stdio.h>

class Test
{
public:
    static int mCount;
public:
    Test()
    {
        mCount++;
    }
    ~Test()
    {
        --mCount;
    }
    int getCount()
    {
        return mCount;
    }
};

int Test::mCount = 0;

int main()
{
    printf("mCount = %d\n", Test::mCount);
    
    return 0;
}

        結果如下

類的靜態成員變量及函數(二十)

        我們看到當沒有定義對象的時候,它的數目是 0。但是這樣做是不安全的,我們在 main 函數中將 mCount 手動改為 100,看看結果還是 0 嗎?

類的靜態成員變量及函數(二十)

        我們看到它變成 100 了。也就是說,這是不安全的。所以這個方法不可取。那么我們這時就需要分析問題了,我們需要什么呢?不依賴對象就可以訪問靜態成員變量,必須保證靜態成員變量的安全性,方便快捷的獲取靜態成員變量的值。在 C++ 中可以定義靜態成員函數:a> 靜態成員函數是類中特殊的成員函數;b> 靜態成員函數屬于整個類所有;c> 可以通過類名直接訪問公有靜態成員函數;d> 可以通過對象名訪問公有靜態成員函數。它的定義便是直接通過 static 關鍵字修飾成員函數。

        下來我們試試靜態成員函數,程序如下

#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("mian begin...");
    
    Demo d;
    
    Demo::staticSetI(d, 10);
    
    printf("d.i = %d\n", d.getI());
    
    Demo::staticFunc("mian end...");
    
    return 0;
}

        結果如下

類的靜態成員變量及函數(二十)

        那么我們試試能否直接在 staticSetI 函數中對 i = v 呢?(去掉 Demo& d),我們試試類的靜態成員變量及函數(二十)

        它報錯了,因為靜態成員函數不能直接訪問普通成員變量。下面我們關于靜態成員函數和普通成員函數的區別做了一個對比,如下圖所示

類的靜態成員變量及函數(二十)

        那么關于我們之前提出的需求,我們可以利用靜態成員函數來滿足,程序如下

#include <stdio.h>

class Test
{
private:
    static int mCount;
public:
    Test()
    {
        mCount++;
    }
    ~Test()
    {
        --mCount;
    }
    static int getCount()
    {
        return mCount;
    }
};

int Test::mCount = 0;

int main()
{
    printf("mCount = %d\n", Test::getCount());
    
    Test t1;
    Test t2;
    
    printf("t1.getCount() = %d\n", t1.getCount());
    printf("t2.getCount() = %d\n", t2.getCount());
    
    Test* pt = new Test();
    
    printf("t2.getCount() = %d\n", pt->getCount());
    
    delete pt;
    
    printf("t2.getCount() = %d\n", pt->getCount());
    
    return 0;
}

        我們看看編譯結果

類的靜態成員變量及函數(二十)

        我們看到已經滿足客戶的需求了。通過對靜態成員變量和函數的學習,總結如下:1、類中可以通過 static 關鍵字定義靜態成員變量;2、靜態成員變量隸屬于類所有,每一個對象都可以訪問靜態成員變量;3、靜態成員變量在全局數據區分配空間,它的生命周期為程序運行期;4、靜態成員函數是類中特殊的成員函數;5、靜態成員函數沒有隱藏的 this 指針,它可以通過類名直接訪問;6、靜態成員函數只能直接訪問靜態成員變量(函數)。


        歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邻水| 南城县| 郑州市| 普兰店市| 铜鼓县| 徐闻县| 福安市| 南康市| 通城县| 中宁县| 寿光市| 许昌县| 定边县| 江源县| 汉川市| 江口县| 阳泉市| 莱西市| 高州市| 茶陵县| 新邵县| 思南县| 蓬溪县| 大关县| 确山县| 潜山县| 舟山市| 桐庐县| 大洼县| 长治市| 武山县| 大邑县| 中方县| 平邑县| 彭水| 金溪县| 柘城县| 乐都县| 武胜县| 健康| 唐河县|