區域性物件和全域性物件

2021-10-04 09:46:04 字數 1845 閱讀 8558

在語塊句中定義的物件稱為區域性物件,包括函式的形參。區域性物件僅在相應的語句塊內部可見,而且還會遮蔽外層作用域中的同名物件

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...