C 中static的使用

2022-05-13 15:05:07 字數 2094 閱讀 8753

1、什麼是static?

static是c++中很常用的修飾符,它被用來控制變數的儲存方式和可見性。

2、為什麼要引入static?

函式內部定義的變數,在程式執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函式在棧上分配的空間在此函式執行結束時會釋放掉,這樣就產生了乙個問題: 如果想將函式中此變數的值儲存至下一次呼叫時,如何實現? 最容易想到的方法是定義乙個全域性的變數,但定義為乙個全域性變數有許多缺點,最明顯的缺點是破壞了此變數的訪問範圍(使得在此函式中定義的變數,不僅僅受此函式控制)。

3、什麼時候用static?

需要

乙個資料物件為整個類而非某個物件服務,同時又力求不破壞類的封裝性

,即要求此成員隱藏在類的內部,對外不可見。

4、static的內部機制:

靜態資料成員要在程式一開始執行時就必須存在。因為函式在程式執行中被呼叫,所以靜態資料成員不能在任何函式內分配空間和初始化

。 這樣,它的空間分配有三個可能的地方,一是作為類的外部介面的標頭檔案,那裡有類宣告;二是類定義的內部實現,那裡有類的成員函式定義;三是應用程式的main()函式前的全域性資料宣告和定義處。

靜態資料成員要實際地分配空間,故不能在類的宣告中定義(只能宣告資料成員)。

類宣告只宣告乙個類的「尺寸和規格」,並不進行實際的記憶體分配,所以在類宣告中寫成定義是錯誤的。

它也不能在標頭檔案中類宣告的外部定義,因為那會造成在多個使用該類的原始檔中,對其重複定義。

static被引入以告知編譯器,將變數儲存在程式的靜態儲存區而非棧上空間,靜態資料成員按定義出現的先後順序依次初始化,注意靜態成員巢狀時,要保證所巢狀的成員已經初始化了。消除時的順序是初始化的反順序。

5、static的優勢:

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

6、引用靜態資料成員時,採用如下格式:

《類名》::《靜態成員名》

如果靜態資料成員的訪問許可權允許的話(即public的成員),可在程式中,按上述格式來引用靜態資料成員。

7、注意事項:

(1)類的靜態成員函式是屬於整個類而非類的物件,所以它沒有this指標,這就導致了它僅能訪問類的靜態資料和靜態成員函式。

(2)不能將靜態成員函式定義為虛函式。

(3)由於靜態成員宣告於類中,操作於其外,所以對其取位址操作,就多少有些特殊,變數位址是指向其資料型別的指標 ,函式位址型別是乙個「nonmember函式指標」。

(4)由於靜態成員函式沒有this指標,所以就差不多等同於nonmember函式,結果就產生了乙個意想不到的好處:成為乙個callback函式,使得我們得以將c++和c-based x window系統結合,同時也成功的應用於執行緒函式身上。

(5)static並沒有增加程式的時空開銷,相反她還縮短了子類對父類靜態成員的訪問時間,節省了子類的記憶體空間。

(6)靜態資料成員在《定義或說明》時前面加關鍵字static。

(7)靜態資料成員是靜態儲存的,所以必須對它進行初始化。

(8)靜態成員初始化與一般資料成員初始化不同:

初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆;

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

初始化時使用作用域運算子來標明它所屬類;

所以我們得出靜態資料成員初始化的格式:

《資料型別》《類名》::《靜態資料成員名》=《值》

(9)為了防止父類的影響,可以在子類定義乙個與父類相同的靜態變數,以遮蔽父類的影響。這裡有一點需要注意:我們說靜態成員為父類和子類共享,但我們又重複定義了靜態成員,這會不會引起錯誤呢?不會,我們的編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標誌。 

static 函式 C 中的static

函式中的靜態變數 當變數宣告為static時,空間將在程式的生命週期內分配,其被存放在在全域性資料區。即使多次呼叫該函式,靜態變數的空間也只分配一次,前一次呼叫中的變數值通過下一次函式呼叫傳遞。這對於在c c 或需要儲存先前函式狀態的任何其他應用程式非常有用。ps 對於乙個完整的程式,在記憶體中的分...

c 中Static靜態變數的使用

static靜態變數與非靜態變數的區別 記憶體分配 靜態變數在應用程式初始化時,就存在於記憶體中,直到它所在的類的程式執行結束時才消亡。初始化 如果不顯式初始化,那麼將被隱式初始化為0。而非靜態變數需要例項化後才分配記憶體。生存週期 靜態變數生存週期為應用程式的生存週期。非靜態變數存在週期取決於例項...

C C 中static的使用

最近在看 c 總是不斷的遇到關鍵字static,對此關鍵字不是很了解,每次遇到都有些困惑,不知道此處為啥要用static,今日通過網上一些資料,仔細認真的了解了 static 的用法。static的在好多程式語言中存在,那他在 c 中出現的原因是什麼呢?換句話說就是在 c 中什麼時候需要使用到 st...