對於一個程序,內存分配情況如下:
============================
| 代碼區 |
--------------------------------------------------
| 全局數據區 |
-------------------------------------------------
| 堆區 |
--------------------------------------------------
| 棧區 |
=============================
一般程序採用new 產生的動態數據存放在堆區,函數內部的自動變量存放在棧區。全局變量和static 修飾的變量放在 全局數據區。
static 的作用:
1. 擴展了生存期
2. 限制了作用域
3. 實現了唯一性
一。 面向過程設計中的 static
1.【靜態數據全局變量】 在全局變量前加關鍵字 static
靜態全局變量特點;
1.該變量在全局數據區分配內存
2.未經初始化得靜態全局變量被初始化爲0
3.靜態全局變量在初始它的文件中是可見的,而在文件之外是不可見的
定義全局變量就可以實現變量在文件中共享,但是定義靜態全局變量還有以下好處;
靜態全局變量不能被其他文件所用。
其他文件中可以定義相同的名字,不會發生衝突。
2. 【靜態局部變量】 在局部變量前加關鍵字 static
通常情況,在函數體內定義變量, 每當程序運行到該語句是, 局部變量會分配棧區內存, 當函數體結束時,系統會回收棧區內存,局部變量也就消失。
但有時希望在兩次調用函數體是, 局部變量的值給予保存。 這樣 靜態局部變量就可以解決這個問題。
靜態局部變量保存在 全局數據區, 特點如下:
1.該變量在全局數據區分配內存
2.靜態局部變量在程序執行到該對象的聲明處初始化,以後函數運行到此不必初始化。
3.靜態局部變量一般在聲明處初始化,若不初始化,默認初始化爲0
4.它始終駐留在全局數據區, 知道程序運行結束。 其作用域是局部作用域,當其定義的函數體結束時, 其作用域也就結束
3【靜態函數】 在函數返回類型前加上static
特點:
1. 只能在它聲明的文件中可見, 不能被其他文件使用
2.其他文件可定義相同名函數, 不發生衝突
二。面向對象設計中的static (類中的static)
1【靜態數據成員變量】 在類內的成員變量前加上static, 該數據成員變量是類的靜態數據成員變量。
特點:
1.靜態數據成員被當做類的成員,無論這個類的對象被定義了多少個,靜態數據成員變量只有一份拷貝,由該類型的所有對象所共享訪問。
2.靜態數據成員變量存放在全局數據區, 屬於本類的所有對象共享。 所以它不屬於某個類對象,在沒有產生類對象時其作用域就可見,
即在沒有產生類的實例前, 就可以操作它。
相對於全局變量,靜態成員變量特點;
1.靜態數據成員變量沒有進入程序的全局名字空間, 不存在與程序中其他全局變量名字衝突的可能
2.可以實現信息的隱藏。 加上關鍵字 private 等, 全局變量則不能
2.【靜態成員函數】
它爲類的全部服務,而不是爲某個類的具體對象拂服務。與普通函數相比, 靜態成員函數由於不是與任何的對象相聯繫,故它不具備this指針,
從這個意義上講, 它無法訪問類的其他非靜態成員函數,也無法訪問類的非其他靜態成員變量,只能調用其他的靜態成員函數。
特點;
1.出現在類體外的函數定義前不能有static 關鍵字。
2. 靜態成員函數可以相互訪問。 靜態成員函數以及靜態成員變量
3. 非靜態成員函數可以隨便的訪問 靜態成員函數以及靜態數據成員變量
4.靜態成員函數不能訪問非靜態成員函數以及非靜態數據成員變量。