c 類中靜態變數和靜態方法使用介紹

2021-10-04 22:24:29 字數 1472 閱讀 5766

靜態成員:主要是為了解決資料共享問題(可用於執行緒之間 資料共享)。全域性變數或者物件也可以實現資料共享,但是全域性變數或者物件具有侷限性。

全域性變數或者物件:容易出現問題,如下所示:在兩個執行緒中,都訪問了全域性變數並且同樣進行了一百次的++操作,結果應該是200,但是經過多次運算後發現每次輸出結果都不同,小於200,所以全域性變數存在巨大bug.

#include #include #include #include int i = 0;//全域性變數

void run1();

void run2();

int main()

void run1()

}void run2()

}

(1)時間片分給執行緒run1執行**,當i在寄存中中累加到了100,此時恰巧時間片被用完了,而存放在暫存器中的中間變數還沒來及寫入實際的物理記憶體。

(2)時間片分配給執行緒run2,由於執行緒a算出來的值並沒有寫回記憶體,所以實際上此時執行緒b還是取得 i == 0 而進行的 ++ 操作,大概進行了 200次 的++ 操作,但這次時間片剛好夠用,執行緒b將得到的 cur == 200 寫回了實際的物理記憶體。

(3)時間片再度分配給執行緒a,執行緒a開始執行它在上乙個時間片結束時沒有執行完的工作,將 i == 100 寫入實際的物理記憶體,計算機嚴格按照**執行指令,殊不知此時會將由執行緒b計算出來的 i == 200 覆蓋,這就是為什麼在上面的當中,三次執行相同的**,得到的結果完全不一致的原因

靜態資料成員:

在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員不會破壞隱藏原則,保證了安全性。因此,靜態靜態成員是類的所有物件中共享的成員,而不是某個物件的 成員

靜態資料成員優點:可以節省記憶體,因為它是所有物件所公有的,因此,對多個物件來說,靜態資料成員只儲存一處,共所有物件使用。靜態資料成員的值對每個物件都是一樣,但它的值是可以更新的。只要對靜態資料成員的值更新一次,保證所有物件訪問更新後的相同的值,這樣可以提高時間效率。

1.靜態資料成員在定義或者說明時前面新增關鍵字static;

2.靜態成員初始化格式:《資料型別》 《類名》::《靜態資料成員名稱》 = 《值》,且靜態成員初始化在類外進行

其中:初始化在類體外進行,而前面不加static,以免與一般靜態變數或者物件相混餚。

初始化時不加該成員的訪問許可權控制符private,public等

初始化時使用作用域運算子來表明它所屬類,因此,靜態資料成員是類的成員,而不是物件的成員。

3.靜態資料成員是靜態儲存的,他是靜態生存期,必須對它進行初始化;

4.引用靜態資料成員時,採用如下格式:(public條件下)

《類名》::《靜態成員名稱》 //靜態變數使用方式

C 類中靜態變數和靜態方法使用介紹

靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如 設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。靜態資料成員 在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了...

C 類中靜態變數和靜態方法使用介紹

刷劍指offer第64題涉及到類內靜態成員與方法的知識,有點模糊,找了兩篇部落格整理一下。最近一直看c 相關的專案,但總是會被c 類中的靜態成員變數與靜態成員函式的理解感覺很是模糊,不明白為什麼類中要是用靜態成員變數.於是在網上蒐集了一些資料,自己再稍微總結下。靜態成員的概念 靜態類中的成員加入st...

C 類中靜態變數和靜態方法的使用

靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如 設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。靜態資料成員 在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了...