C static 靜態資料和靜態函式總結

2021-06-19 05:17:00 字數 2053 閱讀 5562

本文總結了所有關於c++ static修飾的資料和函式使用方法,作用和注意事項。

原創出處:靖空間靖心

關鍵字static在可以修飾變數和函式

一 靜態資料成員:

public/protected/private訪問規則不變

1.靜態資料成員的宣告:

靜態資料成員實際上是類域中的全域性變數。

謹記:在.h類裡面的靜態成員資料和函式都只是相當於宣告的作用,而不是定義!!!

定義才分配空間,而宣告不分配。

在類裡面只有const static才可以初始化,作為常量使用。const或者static都不可以。

2. 靜態資料的定義:

必須在.cpp檔案中定義,否則就會出現無法識別外部符號的錯誤。

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

其實是錯誤的,因為不單只是靜態資料,而是所有資料都不能在.h檔案中定義!

在visual studio中是無法在.h中的變數賦予初始值的,但是我查了下the c++ programming language這本書,好像書中說是可以的,反正這本書是不會有錯的,也許要看編譯器有沒有嚴格執行了c++標準吧。

3.靜態資料成員被 類 的所有物件所共享,包括該類派生類的物件。

可以想象為類內的全域性變數。

4.靜態資料成員可以成為成員函式的可選引數,而普通資料成員則不可以。舉例如下:

class cla;

5. 靜態資料成員的型別可以是本類的型別,而普通資料成員則不可以。

class cla;

6.const可以修改mutable資料成員。

二 靜態成員函式

1.可以在沒有定義任何物件前使用,無須建立任何物件例項

class cla

cla::func();//ok

2.靜態成員函式不可以呼叫類的非靜態成員, 靜態成員函式不含this指標。

而非靜態成員必須與特定物件相對。

3.靜態成員函式不允許使用型別限定符,就是不可以同時宣告為 virtual、const、volatile函式。

class base;
static作用:

1)隱藏,不同檔案可以有相同的static全域性變數名,不會產生衝突,因為static變數是只在本檔案可見。

2)保持變數內容的持久, 可作統計次數功能,如統計同乙個類建立了多少個物件。

3)預設初始化為0,

4)靜態函式會被自動分配在乙個一直使用的儲存區,直到退出應用程式例項,避免了呼叫函式時壓棧出棧,速度快很多。 

5)可以在子類定義乙個與父類相同的靜態變數,這就遮蔽了父類的靜態變數。

全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00。

但是為了養成良好習慣,也應該手動初始化一下。

最後對static的三條作用做一句話總結。首先static的最主要功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備永續性和預設值0。

靜態儲存區:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。主要存放靜態資料、全域性資料和常量。

引用網上某人的分析:

c程式一直由下列部分組成:

1)正文段——cpu執行的機器指令部分;乙個程式只有乙個副本;唯讀,防止程式由於意外事故而修改自身指令;    

2)初始化資料段(資料段)——在程式中所有賦了初值的全域性變數,存放在這裡。    

3)非初始化資料段(bss段)——在程式中沒有初始化的全域性變數;核心將此段初始化為0。     

4)棧——增長方向:自頂向下增長;自動變數以及每次函式呼叫時所需要儲存的資訊(返回位址;環境資訊)。      

5)堆——動態儲存分。

當static用來修飾區域性變數的時候,它就改變了區域性變數的儲存位置,從原來的棧中存放改為靜態儲存區。但是區域性靜態變數在離開作用域之後,並沒有被銷毀,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問。

C static 靜態資料和靜態函式總結

本文總結了所有關於c static修飾的資料和函式使用方法,作用和注意事項。原創出處 靖空間靖心 關鍵字static在可以修飾變數和函式 一 靜態資料成員 public protected private訪問規則不變 1.靜態資料成員的宣告 靜態資料成員實際上是類域中的全域性變數。謹記 在.h類裡面...

C static 靜態資料成員 靜態成員函式

用static修飾類中的資料成員,被稱為靜態資料成員。他並不依賴於物件的例項化,而依賴於類。所以靜態資料成員不在建構函式中初始化,它單獨進行初始化 就算物件沒有例項化,他也存在。而普通資料成員依賴於物件的例項化,若物件沒有例項化,它就不存在。假設有乙個tank類 class tank 若物件還沒有例...

C static靜態成員

class a a void fun 普通成員函式 static void printnum 靜態成員函式 private int m a 普通成員變數 int m b 普通成員變數 static int num 靜態成員變數 靜態成員必須在定義類的檔案中對靜態成員變數進行初始化,否則會編譯出錯。i...