C 中的static關鍵字 雜談

2021-07-10 18:57:35 字數 2436 閱讀 8975

在網上蒐集了一些資料,內容來自四面八方,各取所需吧,,,

作用一:隱藏

作用二:保持變數內容的持久

作用三:

預設初始化為

0共有兩種變數儲存在靜態儲存區:全域性變數和

static

變數,只不過和全域性變數比起來,

static

可以控制變數的可見範圍。首先

static

的最主要功能是隱藏,其次因為

static

變數存放在靜態儲存區,所以它具備永續性和預設值0。

靜態資料成員/成員函式

表示屬於乙個類

而不是屬於此類的任何特定物件的變數和函式. 這是與普通成員函式的最大區別, 也是其應用所在, 比如在對某乙個類的物件進行計數時, 計數生成多少個類的例項, 就可以用到靜態資料成員

。在這裡面, static既不是限定作用域的, 也不是擴充套件生存期的作用, 而是指示變數/函式在此類中的唯一性.

。這也是」屬於乙個類而不是屬於此類的任何特定物件的變數和函式」的含義.

。因為它是對整個類來說是唯一的, 因此不可能屬於某乙個例項物件的

。(針對靜態資料成員而言, 成員函式不管是否是static, 在記憶體中只有乙個副本, 普通成員函式呼叫時, 需要傳入this指標, static成員函式呼叫時, 沒有this指標)

static 用來控制變數的儲存方式和可見性

函式內部定義的變數,在程式執行到它的定義處時,編譯器為它在棧上分配空間,函式在棧上分配的空間在此函式執行結束時會釋放掉,這樣就產生了乙個問題: 如果想將函式中此變數的值儲存至下一次呼叫時,如何實現? 最容易想到的方法是定義乙個全域性的變數,但定義為乙個全域性變數有許多缺點,最明顯的缺點是破壞了此變數的訪問範圍(使得在此函式中定義的變數,不僅僅受此 函式控制)。需要乙個資料物件為整個類而非某個物件服務,同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內部,對外不可見。

static 的內部機制:

靜態資料成員要在程式一開始執行時就必須存在。因為函式在程式執行中被呼叫,所以靜態資料成員不能在任何函式內分配空間和初始化。這樣,它的空間分配有三個可能的地方,一是作為類的外部介面的標頭檔案,那裡有類宣告;二是類定義的內部實現,那裡有類的成員函式定義;三是應用程式的 main()函式前的全域性資料宣告和定義處。

靜態資料成員要實際地分配空間,故不能在類的宣告中定義(只能宣告資料成員)。類宣告只宣告乙個類的「尺寸和規格」,並不進行實際的記憶體分配,所以在類宣告中寫成定義是錯誤的。它也不能在標頭檔案中類宣告的外部定義,因為那會造成在多個使用該類的原始檔中,對其重複定義。

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

static 的優勢:

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

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

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

ps:(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 用以生成唯一的標誌。

c中static關鍵字

看別人的c 會看到很多變數或者函式前面帶有static關鍵字。c中的static和php中的static有很到的不同,在php中static表示靜態化變數,乙個類中的static成員只與類有關,而與類的例項無關。c中的static關鍵字主要用於隱藏 access control 1.隱藏 函式前的s...

C 中static關鍵字

c 的static有兩種用法 面向過程程式設計中的static和物件導向程式設計中的static。前者應用於普通變數和函式,不涉及類 後者主要說明static在類中的作用。一 面向過程設計中的static 1 靜態全域性變數 在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域性變...

C 中static 關鍵字

c 包含了c的特性和c 的特性,static 自然也具備了這兩者的特性 靜態全域性變數 該變數在全域性資料區分配記憶體 未經初始化的靜態全域性變數會被程式自動初始化為0 自動變數的值是隨機的,除非它被顯式初始化 靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的 靜態區域性變數 在區...