靜態變數,靜態函式對於一些c,c++的初學者來說,造成了不少的困擾。昨晚和寢室的室友討論到這
個問題,想了一下,作了一下總結:
雖然說c和c++在很多人的眼裡就是孿生姐妹,其實還是有很大區別的。在這裡分別談論在c和c++中靜
態成員和靜態函式的區別:
c中:在介紹之前,先說說變數的生存週期和作用域,很多人對這個概念很陌生,或者是ambiguous。
生存週期:是從時間概念上來說,變數在程式啟動後,從時間a到時間b這段時間中,變數一直存在於
記憶體中,那麼a->b稱為變數的生存週期。它在時間上時連續的,在空間上可以不連續,也就是說,它
可能在a->b這段時間內,程式執行到某段區域,我們無法對變數進行訪問,但是,它卻是實實在在的
存在於記憶體中,沒有銷毀。
作用域:是空間上的概念,是指變數在生存週期內的乙個概念,當程式在變數的生存週期a->b內,運
行到某段區域時,該變數如果可操作,那麼稱這段區域為作用域。
1.static變數:
1)區域性:
靜態區域性變數在函式內定義,生存週期為整個源程式,但作用域與自動變數相同,即只能在函式的作
用於中。退出該函式後,就無法使用了。
2)全域性:
全域性變數本身就是靜態儲存方式,當然全域性static變數也是靜態儲存方式。但是他們的作用域是整個
源程式,自動全域性變數的作用於也是整個程式,但是這裡需要注意的是,如果只有乙個原始檔,那麼
全域性靜態變數和全域性自動變數非常類似,但是如果有多個原始檔,那麼全域性static變數的作用於僅限
於定義所在的原始檔,在其他的檔案中是無法使用的。就是說在不同的檔案中可以定義名稱相同的全
局static變數。
2.static函式
static函式在c中也叫內部函式,因為static修飾的函式無法再其它檔案中使用,
在介紹之前,先討論一下 堆,棧,自由儲存區,全域性/靜態儲存區和常量儲存區
堆:用new分配,free釋放
自由儲存區:malloc分配,delete釋放
棧:編譯器管理的區域性變數和函式引數等。
全域性/靜態儲存區:儲存靜態變數和全域性變數
字元常量區:常量儲存的記憶體
也就是說static修飾函式的僅有乙個意思:就是告訴編譯器,我是乙個內部函式,不要隨便的用我。
(這裡插入乙個小片段,以前我一直以為c語言中的static函式中只能使用static變數,在今天總結
的時候,發現是錯的,呵呵。。)
下面再來看看c++中的static變數和static成員函式:
先看個有趣的例子:
class test
}int test::a=2;//ok,
void main()
}靜態成員有乙個好處就是在乙個物件都沒有構造的時候就可以對該變數進行訪問。
注意:static成員函式,由於static成員函式並不包含this指標,所以無法對類的非static成員變數
進行任何操作。並且static成員函式是無法宣告為const型別的,因為const就是說不會修改該函式所
屬的物件,由於static根本就不屬於哪個物件,所以會造成編譯錯誤。
C語言C 語言中靜態變數和靜態函式
c語言中需要記憶體來存放資料。而記憶體主要分為兩類 靜態儲存區和動態儲存區 1.靜態儲存區分為 唯讀資料 readonly data 區 以讀寫資料 rw data 區 未初始化區 bss 它們都是在程式編譯連線階段確定的,在程式執行的階段不會改變。2.動態儲存區分為堆和棧。都是程式執行的過程中動態...
C語言C 語言中靜態變數和靜態函式
c語言中需要記憶體來存放資料。而記憶體主要分為兩類 靜態儲存區和動態儲存區 1.靜態儲存區分為 唯讀資料 readonly data 區 以讀寫資料 rw data 區 未初始化區 bss 它們都是在程式編譯連線階段確定的,在程式執行的階段不會改變。2.動態儲存區分為堆和棧。都是程式執行的過程中動態...
c語言中靜態變數和靜態函式
1.static 變數 靜態變數的型別 說明符是static。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。例如外部變數雖屬於靜態 儲存方式,但不一定是靜態變數,必須由 static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。2.靜態區域性變數 靜態區域性變數屬...