C C 中區域性 全域性變數初始值或預設值問題

2022-09-18 13:30:18 字數 2272 閱讀 6427

**文章,僅供學習用,

在c語言中的全域性變數和靜態變數都是會自動初始化為0,堆和棧中的區域性變數不會初始化而擁有不可**的值。 c++保證了所有物件與物件成員都會初始化,但其中基本資料型別的初始化還得依賴於建構函式。 下文來詳細**c風格的」預設初始化」行為,以及c++中成員變數的初始化規則。

初始化的語法

很多人至今不知道c++中如何正確地初始化乙個變數,我們首先來解決語法的問題。 c語言中在宣告時用=即可完成初始化操作。但我們偏向於使用c++風格(本文中均指物件導向程式設計風格)來初始化內建型別:

// c 風格

int i =3;

int arr=

;// c++ 風格

inti(3

);int i =

int(3)

;int

*p = new int(3

);int* arr = new int[3

];

在c語言中int a;表示宣告了整型a但未初始化,而c++中的物件總是會被初始化的,無論是否寫了圓括號或者是否寫了引數列表,例如:

int basic_var;

// 未初始化:應用"預設初始化"機制

cperson person;

// 初始化:以空的引數列表呼叫建構函式

預設初始化規則

定義基本資料型別變數(單個值、陣列)的同時可以指定初始值,如果未指定c++會去執行預設初始化(default-initialization)。 那麼什麼是」預設初始化」呢?

//c++中

int i;

// 不確定值

int i =

int();

// 0

int*p = new int

;// 不確定值

int*p = new int()

;// 0

靜態和全域性變數的初始化

未初始化的和初始化為零的靜態/全域性變數編譯器是同樣對待的,把它們儲存在程序的bss段(這是全零的一段記憶體空間)中。所以它們會被」預設初始化」為零。

來看例子:

int g_var;

int*g_pointer;

static

int g_static;

intmain()

;

輸出:

0

// 全域性變數

0x0// 全域性指標

0// 全域性靜態變數

32767

// 區域性變數

0x7fff510cfa68

// 區域性指標

0// 區域性靜態變數

動態記憶體中的變數在上述**中沒有給出,它們和區域性變數(自動變數)具有相同的」預設初始化」行為。

成員變數的初始化

成員變數分為成員物件和內建型別成員,其中成員物件總是會被初始化的。而我們要做的就是在建構函式中初始化其中的內建型別成員。

class a

;a g_var;

intmain()

輸出:

0

2407223

0

可見內建型別的成員變數的」預設初始化」行為取決於所在物件的儲存型別,而儲存型別對應的預設初始化規則是不變的。 所以為了避免不確定的初值,通常會在建構函式中初始化所有內建型別的成員。effective c++: item 4一文討論了如何正確地在建構函式中初始化資料成員。 這裡就不展開了,直接給出乙個正確的初始化寫法:

class a

;

封閉類巢狀成員的初始化

再來**一下當物件聚合發生時成員變數的」預設初始化」行為,同樣還是只關注於基本資料型別的成員。

class a

;class b

;b g_var;

intmain()

輸出:

0

043224321

-1610612736

規則還是是一樣的,預設初始化行為取決於它所屬物件的儲存型別。 封閉類(enclosing)中成員物件的內建型別成員變數的」預設初始化」行為取決於當前封閉類物件的儲存型別,而儲存型別對應的預設初始化規則仍然是不變的。

Go中區域性全域性變數的區分

這是可能也許是容易混淆滴,先上1個例子 package main import fmt var nickname 大蝦 func main func show func change 上面會輸出 大蝦大蝦小蝦大蝦 我們稍微改動下 package main import fmt var nicknam...

Go中區域性全域性變數的區分

這是可能也許是容易混淆滴,先上1個例子 package main import fmt var nickname 大蝦 func main func show func change 上面會輸出 大蝦大蝦小蝦大蝦 我們稍微改動下 package main import fmt var nicknam...

c c 全域性變數與區域性變數

在c c 中變數是最基本的成員,也是我們最常用的東西,變數大體上分為全域性變數與區域性變數兩種,全域性變數是在整個程式中都可以使用,而區域性變數只能在最接近定義它的一組大括號內使用,總的來說,在c c 裡面,變數只有定義了並在其生命週期內才能使用。說得有點抽象,給大家看個例子吧。a 全域性變數 in...