標籤:地區 之間 不顯示 相同 隱式 自己 代碼 靜態變數 nbsp
一個完整的程式,在記憶體中的分布情況如下: 具體分布圖 自己看書去!!!!!
1.棧區: 由編譯器自動分配釋放,像局部變數,函數參數,都是在棧區。會隨著作用於退出而釋放空間。
3.堆區:程式員分配並釋放的地區,像malloc(c),new(c++)
3.全域資料區(靜態區):全域變數和靜態便令的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊地區,未初始化的全域變數和未初始化的靜態變數在相鄰的另一塊地區。程式結束釋放。
4.代碼區
C 語言的 static 關鍵字有三種(具體來說是兩種)用途:
1. 靜態局部變數:用於函數體內部修飾變數,這種變數的生存期長於該函數。
2. 靜態全域變數:定義在函數體外,用於修飾全域變數,表示該變數只在本檔案可見。
3. 靜態函數:靜態函數跟靜態全域變數的作用類似:
一. 靜態函數不能被其它檔案所用;
二. 其它檔案中可以定義相同名字的函數,不會發生衝突;
==========================================================================
:在C語言中,static主要定義全域靜態變數,定義局部靜態變數,定義靜態函數
一、 定義全域靜態變數 :在全域變數前面加上關鍵字static,該全域變數變成了全域靜態變數。全域靜態變數有以下特點:
(1) 在全域資料區內分配記憶體
(2) 如果沒有初始化,其預設值為0
(3) 該變數在本檔案內從定義開始到檔案結束可見
二、 定義局部靜態變數:在局部靜態變數前面加上關鍵字static,該局部變數便成了靜態局部變數。靜態局部變數有以下特點:
(1) 該變數在全域資料區分配記憶體
(2) 如果不顯示初始化,那麼將被隱式初始化為0
(3) 它始終駐留在全域資料區,直到程式運行結束
(4) 其範圍為局部範圍,當定義它的函數或語句塊結束時,其範圍隨之結束。
三、 定義靜態函數:在函數的傳回型別加上static關鍵字,函數即被定義成靜態函數。靜態函數有以下特點:
(1) 靜態函數只能在本源檔案中使用
(2) 在檔案範圍中聲明的inline函數預設為static
說明:靜態函數只是一個普通的全域函數,只不過受static限制,他只能在檔案所在的編譯模組內使用,不能夠在其他編譯模組內使用。
C++對static的擴充
1)在類中的static修飾的成員變數屬於類可以共用,相當於全域變數,不屬於具體的某個執行個體或者對象,也就是說當某個類的執行個體修改了該靜態成員變數,其修改值為該類的其它所有執行個體所見,還有必須在類外初始化,static成員變數訪問形式:1°可以被對象訪問 2° 可以被類訪問 3°可以被對象指標訪問
2)普通函數有this指標,指標可訪問所有成員,但在類中的static成員函數屬於整個類所擁有,這個函數不接收this指標,所以只能訪問類的static成員變數。static只能在聲明函數時加,不能再定義時候加(類中聲明,類外初始化)
在C++語言中新增了兩種作用:定義待用資料成員或靜態函數成員
(1) 定義待用資料成員。待用資料成員有如下特點:
(1) 記憶體配置:在程式的全域資料區分配
(2) 初始化和定義:待用資料成員定義時要分配空間,所以不能在類聲明中定義
(3) 靜態成員函數。靜態成員函數與類相聯絡,不與類的對象相聯絡。靜態成員函數不能訪問非待用資料成員。原因很簡單,非待用資料成員屬於特定的類執行個體,主要用於對待用資料成員的操作。
(4) 靜態成員函數和待用資料成員都沒有this指標。
1.靜態成員之間可以相互訪問,包括靜態成員函數訪問待用資料成員和訪問靜態成員函數;
2.非靜態成員函數可以任意地訪問靜態成員函數和待用資料成員;
3.靜態成員函數不能訪問非靜態成員函數和非待用資料成員;
4.調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指標調用靜態成員函數,也可以用類名::函數名調用(因為他本來就是屬於類的,用類名調用很正常)
---------------------
1 static修飾的變數先於對象存在,所以static修飾的變數要在類外初始化。因為static是所有對象共用的東西嘛,必須要比對象先存在的。
2 用static修飾的成員變數在對象中是不佔記憶體的,因為他不是跟對象一起在堆或者棧中產生,用static修飾的變數在靜態儲存區產生的,所以用static修飾一方面的好處是可以節省對象的記憶體空間。
3 由於static修飾的類成員屬於類,不屬於對象,因此static類成員函數是沒有this指標的,this指標是指向本對象的指標。正因為沒有this指標,所以static類成員函數 不能訪問非static的類成員,只能訪問 static修飾的類成員。
從c到cpp對static 關鍵字的總結 需要整理下!!!!!!!!!!!!!!!!!!!!!!