關於C/C++中,對static關鍵字的理解

準備知識: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;

相關文章
相關標籤/搜索