c 成員變數的初始化順序

2021-08-01 15:48:56 字數 1435 閱讀 1389

class a

void print()

輸出:

n1:隨機

n2:0

如果把建構函式寫成不是用初始化列表,而是在建構函式體內初始化的形式:

a()

那麼輸出結果就是n1是2,n2是0

分析:

1、成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。因為成員變數的初始化次序是根據變數在記憶體中次序有關,而記憶體中的排列順序早在編譯期就根據變數的定義次序決定了。這點在effectivec++中有詳細介紹。

2、如果不使用初始化列表初始化,在建構函式內初始化時,此時與成員變數在建構函式中的位置有關。

3、注意:類成員在定義時,是不能初始化的

4、注意:類中const成員常量必須在建構函式初始化列表中初始化。

5、注意:類中static成員變數,必須在類外初始化。

6、靜態變數進行初始化順序是基類的靜態變數先初始化,然後是它的派生類。直到所有的靜態變數都被初始化。這裡需要注意全域性變數和靜態變數的初始化是不分次序的。這也不難理解,其實靜態變數和全域性變數都被放在公共記憶體區。可以把靜態變數理解為帶有「作用域」的全域性變數。在一切初始化工作結束後,main函式會被呼叫,如果某個類的建構函式被執行,那麼首先基類的成員變數會被初始化。

bbb的成員變數定義:

private:

int n1;

int n2;

bbb的建構函式:

bbb::bbb()

:n2(1),

n1(2)

彙編**:

00401535 mov eax,dword ptr [ebp-4]

00401538 mov dword ptr [eax+4],2

0040153f mov ecx,dword ptr [ebp-4]

00401542 mov dword ptr [ecx+8],1

然後依照派生鏈初始化派生類的成員函式。

.總結:

變數的初始化順序:

1 基類的靜態變數或全域性變數

2 派生類的靜態變數或全域性變數

3 基類的成員變數

4 派生類的成員變數

對於乙個空類,編譯器會自動宣告4個預設函式:建構函式、拷貝建構函式、賦值函式、析構函式(如果不想使用自動生成,就應該明確拒絕),這些生成的函式都是public且inline的。

建構函式不能是虛函式:因為vptr變數是在建構函式中進行初始化的,要想執行虛函式必須通過vptr變數找到虛函式表。這就自相矛盾,先有雞還是先有蛋?

C 成員變數的初始化順序

知識點 在c 中,成員變數的初始化順序只與它們在類中宣告的順序有關,而與初始化列表中的順序無關。不知道大家知不知道這個,反正我是不知道 或者忘了 我是在 劍指offer 上看到的,後來在 effective c 中條款4中再次看到,特地在這記錄一下,防止忘記。下面舉個具體的例子,摘自 劍指offer...

C 成員變數的初始化順序

順序為 基類的靜態變數或全域性變數 派生類的靜態變數或全域性變數 基類的成員變數 派生類的成員變數 注意 成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。如果不使用初始化列表初始化,在建構函式內初始化時,此時與成員變數在建構函式中的位置有關。類中c...

C 成員變數的初始化順序問題

由於面試題中,考官出了一道簡單的程式輸出結果值的題 如下,cpp view plain copy print?class a void print int main class a void print a 那麼此時輸出結果為 分析 1 成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的...