自然界中的事物都有產生和消亡,都有生存期,程式中的簡單變數和類的物件也一樣有它們的生存期,它們也會產生和消亡。物件的生存期分為靜態生存期和動態生存期兩種。什麼叫做靜態生存期和動態生存期呢?
1.靜態生存期
若某個物件它的生存期與程式的執行期相同,我們就說它具有靜態生存期,就是說在程式執行期間它都不會釋放。
具有檔案作用域的物件都具有靜態生存期。
函式內部具有塊作用域的物件怎樣才能具有靜態生存期呢?我們可以使用關鍵字static修飾物件。比如,static int x;這個語句就是將x宣告為具有靜態生存期的變數,也成為靜態變數。
2.動態生存期
除了上述情況的物件具有靜態生存期外,其餘物件都具有動態生存期。
具有動態生存期的物件產生於宣告處,於該物件的作用域結束處釋放。
下面舉個例子說明下簡單變數和類的物件的生存期,其中涉及到了全域性變數和區域性變數。
#include
using namespace std;
int a=1; // a為全域性變數,它具有靜態生存期。
void
fun(void);
int main()
void
fun(void)
執行結果:
---main---
a: 1 x: 0 y: 5 z: 1
---fun---
a: 21 x: 7 y: 0 z: 14
---main---
a: 21 x: 0 y: 5 z: 3
---fun---
a: 51 x: 10 y: 7 z: 14
這裡要說明下,
靜態區域性變數如果沒有進行顯式初始化,那麼它將被預設初始化為0。當第二次進入fun
函式時,其靜態區域性變數x和y將不再初始化,x和y將繼續使用fun函式第一次被呼叫後最後的值來參加下面的運算。
具體點說,
第一次呼叫完fun函式後,fun中變數x的值是7,在第二次呼叫fun函式時,x不會被賦值為4,而是繼續使用7作為自己的值。
用時鐘類來舉乙個例子。
#include
using namespace std;
class clock //時鐘類宣告
private: //私有資料成員
int hour,minute,second;
};//時鐘類成員函式實現
clock::clock() //建構函式
void clock::settime(int newh,int newm,int news)
void clock::showtime()
//宣告全域性物件g_clock,具有檔案作用域,靜態生存期
clock g_clock;
int main() //主函式
執行結果:
檔案作用域的時鐘類物件:
0:0:0
塊作用域的時鐘類物件:
10:20:30
這個程式中定義了具有各種作用域的物件,clock類宣告中,settime函式宣告的三個引數具有函式原型作用域,資料成員具有類作用域,全域性物件g_clock具有檔案作用域,物件myclock具有塊作用域。除g_clock具有靜態生存期外,其餘均有動態生存期。
靜態生存期和動態生存期
靜態生存期 定義 如果某乙個物件的生存期和程式的執行的生存期一樣,則這個物件具有靜態生存期。關鍵字 static 特點靜態變數不會隨著每次函式的呼叫產生乙個新的副本,也不會隨著函式返回而失效。第n次呼叫函式時,靜態變數的值為第n 1次呼叫的靜態變數的值,依次類推!也就是說靜態變數 第一次賦值有效,也...
變數生存期
統計共呼叫counter 函式多少次。count.c檔案 include intmain mycounter.c counter 函式 void counter 函式宣告 void counter 執行結果為 count 1,結果不對。因為counter 函式中的count是區域性變數,自動儲存,每...
變數的生存期
標籤 空格分隔 c 雙學位高階語言程式設計 c函式 這節課我們要學習以下幾個問題 編譯器是如何區分不同作用域中的同名變數的呢?編譯器將它們分配給了不同的位址,所以能夠區分。程式執行時,編譯器是如何為程式分配記憶體空間的呢?儲存區分類 記憶體資料分類 線性從上到下 記憶體低位址端 唯讀儲存區 區唯讀儲...