C 程式設計必知 生存期

2021-06-28 10:00:50 字數 1600 閱讀 8963

自然界中的事物都有產生和消亡,都有生存期,程式中的簡單變數和類的物件也一樣有它們的生存期,它們也會產生和消亡。物件的生存期分為靜態生存期和動態生存期兩種。什麼叫做靜態生存期和動態生存期呢?

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函式 這節課我們要學習以下幾個問題 編譯器是如何區分不同作用域中的同名變數的呢?編譯器將它們分配給了不同的位址,所以能夠區分。程式執行時,編譯器是如何為程式分配記憶體空間的呢?儲存區分類 記憶體資料分類 線性從上到下 記憶體低位址端 唯讀儲存區 區唯讀儲...