準備知識:c/c++的記憶體分布
對於乙個完整的程式,在記憶體中的分布情況如下:
1.棧區: 由編譯器自動分配釋放,像區域性變數,函式引數,都是在棧區。會隨著作用域退出而釋放空間。
2.堆區:程式設計師分配並釋放的區域,像malloc(c),new(c++)
3.全域性資料區(靜態區):內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。程式結束釋放。
4.**區
在不同的語言環境、或者同一語言不同上下文環境中,static關鍵字具有不同的意思。
1、c語言中
1.1 宣告為static的變數具有以下三部分特性:
1)儲存位置:儲存於靜態記憶體中
2)建立與作用域:靜態變數在程式執行之前建立,在程式的整個執行期間始終存在。
3)初始化取值
1.2 型別
1.2.1 靜態全域性變數:
1)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在)
2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
3)作用域:全域性靜態變數在宣告他的檔案之外是不可見的,不能被其他檔案所共享。準確地講從定義之處開始到檔案結尾。
好處:定義全域性靜態變數的好處:
<1>不會被其他檔案所訪問,修改
<2>其他檔案中可以使用相同名字的變數,不會發生衝突。
1.2.2靜態區域性變數:
1)記憶體中的位置:靜態儲存區
2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
3)作用域:作用域仍為區域性作用域,當定義它的函式或者語句塊結束的時候,作用域隨之結束。
1.2.3 靜態函式
函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。
定義靜態函式的好處:
1)其他檔案中可以定義相同名字的函式,不會發生衝突
2) 靜態函式不能被其他檔案所用。
2、c++中
2.1靜態資料成員
在類內資料成員的宣告前加上關鍵字static,該資料成員就是類內的靜態資料成員.
1)儲存位置:靜態資料成員儲存在全域性資料區
2)初始化:在類體外進行初始化。<資料型別><類名>::<靜態資料成員名>=<值>
3)靜態資料成員被當作是類的成員。無論這個類的物件被定義了多少個,靜態資料成員在程式中也只有乙份拷貝,由該型別的所有物件共享訪問。
4)訪問方式:<類物件名>.<靜態資料成員名> 或 <類型別名>::<靜態資料成員名>
5)在沒有產生類的例項時,也可以訪問靜態資料成員
因為靜態資料成員在全域性資料區分配記憶體,屬於本類的所有物件共享,所以,它不屬於特定的類物件,在沒有產生類物件時其作用域就可見,即在沒有產生類的例項時,我們就可以操作它;
2.2靜態成員函式
特點:1)非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;
2) 靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;
3)由於沒有this指標的額外開銷,因此靜態成員函式與類的全域性函式相比速度上會有少許的增長;
4)呼叫靜態成員函式,可以用成員訪問操作符(.)和(->)為乙個類的物件或指向類物件的指標呼叫靜態成員函式,也可以直接使用如下格式:
<類名>::<靜態成員函式名>(<參數列>)
5)出現在類體外的函式定義不能指定關鍵字static;
C C 中的static關鍵字
關鍵字extern和static用來說明具有靜態儲存期的變數和函式。用static宣告的區域性變數只能被定義該變數的函式所識別,但是不同於自動變數的是,static變數在其函式被呼叫退出後,仍保留其值。下次函式被呼叫時,可以訪問最近一次被修改後的值。static變數的宣告方法如下 static in...
C C 中static關鍵字詳解
靜態變數作用範圍在乙個檔案內,程式開始時分配空間,結束時釋放空間,預設初始化為0,使用時可以改變其值。如果一區域性變數被宣告為static,那麼將只有唯一的乙個靜態分配的物件,它被用於在該函式的所有呼叫中表示這個變數。這個物件將只在執行執行緒第一次到達它的定義使初始化。用法2 區域性靜態物件 對於區...
C C 中static關鍵字詳解
下面是main.c的內容 int main void 程式的執行結果是 a hello 你可能會問 為什麼在a.c中定義的全域性變數a和函式msg能在main.c中使用?前面說過,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。此例中,a是全域性變數,msg是函式...