準備知識:C/C++的內存分佈c++
對於一個完整的程序,在內存中的分佈狀況以下:
1.棧區: 由編譯器自動分配釋放,像局部變量,函數參數,都是在棧區。會隨着做用域退出而釋放空間。
2.堆區:程序員分配並釋放的區域,像malloc(c),new(c++)
3.全局數據區(靜態區):內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。程序結束釋放。程序員
4.代碼區函數
在不一樣的語言環境、或者同一語言不一樣上下文環境中,static關鍵字具備不一樣的意思。this
一、C語言中spa
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) 靜態函數不能被其餘文件所用。
二、C++中
2.1靜態數據成員
在類內數據成員的聲明前加上關鍵字static,該數據成員就是類內的靜態數據成員.
1)存儲位置:靜態數據成員存儲在全局數據區
2)初始化:在類體外進行初始化。<數據類型><類名>::<靜態數據成員名>=<值>
3)靜態數據成員被看成是類的成員。不管這個類的對象被定義了多少個,靜態數據成員在程序中也只有一份拷貝,由該類型的全部對象共享訪問。
4)訪問方式:<類對象名>.<靜態數據成員名> 或 <類類型名>::<靜態數據成員名>
5)在沒有產生類的實例時,也能夠訪問靜態數據成員
由於靜態數據成員在全局數據區分配內存,屬於本類的全部對象共享,因此,它不屬於特定的類對象,在沒有產生類對象時其做用域就可見,即在沒有產生類的實例時,咱們就能夠操做它;
2.2靜態成員函數
特色:
1)非靜態成員函數能夠任意地訪問靜態成員函數和靜態數據成員;
2) 靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;
3)因爲沒有this指針的額外開銷,所以靜態成員函數與類的全局函數相比速度上會有少量的增加;
4)調用靜態成員函數,能夠用成員訪問操做符(.)和(->)爲一個類的對象或指向類對象的指針調用靜態成員函數,也能夠直接使用以下格式:
<類名>::<靜態成員函數名>(<參數表>)
5)出如今類體外的函數定義不能指定關鍵字static;