在語塊句中定義的物件稱為區域性物件,包括函式的形參。區域性物件僅在相應的語句塊內部可見,而且還會遮蔽外層作用域中的同名物件。
1、自動物件
自動物件的生命期開始於定義語句的執行,結束於作用域的結尾處。
函式形參是自動物件,進入函式時被分配儲存空間,函式執行結束時消亡。
對於未初始化的區域性物件,值為隨機值。
2、區域性靜態物件
乙個函式被多次呼叫時,有時候希望函式體內部定義的某些區域性變數具有靜態儲存週期,可以在每一次函式執行之後都可儲存下來。用關鍵字static定義,這樣的物件稱為區域性靜態物件,預設初始值為0.
int
fun(
)int
main()
其中物件a從進入到fun函式時,生命期開始,函式執行完畢後a的生命期也就結束。b的生命期起始於第一次進入其作用域時,終止於程式執行結束時,最終輸出結果為 2 3 4在函式外面定義的物件成為全域性物件,全域性物件具有靜態儲存週期,具有全域性作用域,也稱為檔案域。
#include
//#include
#include
#include
#include
using
namespace std;
int i;
void
other()
intmain()
程式執行時,先定位在main函式。在main函式中由區域性靜態變數a,由於沒有初始化,a的值應該是0,用指標p指向a可以讀取a的位址。再定義區域性自動物件,b為-10,c為0。又由於i是全域性變數,其初始值預設為0。
於是便得到了第次輸出**:
—main—
i:0a:0b:-10c:0
程式繼續執行,此時c+=8,可以得到c變成了8,再進入到other函式中。定義了乙個區域性靜態變數,用指標r指向a可以發現,其與main函式中的a不是同乙個變數,因為兩者位址不同,因此此時再other函式中的a是2
再定義乙個區域性靜態變數b,未初始化,預設值為0,定義乙個區域性自動變數c,根據遮蔽效應,此時c的值不再是8,而是10
於是可以得到第二次輸出**:
—other—
i:32a:4b:0c:15
注意!!!此處b=a代表的是再other函式的區域性靜態變數b=a=4,此時other函式中的c已經被釋放,a,b還是存在。
回到main函式再次輸出時,由於i是全域性變數,變為32,a還是main函式中的a=0,b也與main函式相同=-10,c=8.
得到第三次輸出**:
—main—
i:32a:0b:-10c:8
程式又回到了other函式由於a,b是區域性靜態變數,上次在other函式執行過後的值被保留,但是c由於是區域性自動變數,仍然需要重新定義為10
得到第四次輸出結果:
—other—
i:74a:6b:4c:15
歡迎指正!
C 之全域性物件,區域性物件,靜態區域性物件
先說兩個概念 作用域 scope 和生命週期 lifetime 作用域 名字的作用域指的是知道該名字的程式文字區域 生命週期 物件的生命週期指在程式執行過程中物件存在的時間 全域性物件,顧名思義是全域性的物件,其作用域是整個程式文字,其物件的宣告週期是整個程式的執行過程 區域性物件 一般說的區域性變...
區域性物件與全域性物件的構造和析構
例程除錯,很多細節問題。可以單步除錯後,切入到反彙編進行觀察。include pch.h include include include include using namespace std namespace nmsp1 命名空間 a int m i void func a obja 現用現定義...
全域性物件和全域性靜態 區域性靜態析構順序
多久不用c 好多東西都模糊了,最近跟人討論全域性和靜態的析構順序,之前總覺得這個根據編譯器來決定的,其實還是有一定的說法的。記錄一下 class a destructor delete a class b destructor 區域性變數 class d destructor 區域性靜態變數 cla...