c 初始化順序

2021-09-27 09:49:24 字數 1780 閱讀 4305

**:

#include using namespace std;

class a

~a() {};

void print()

private:

int m;

int n;

static int p;

const int q;

int s = 1;

};int a::p = 1;

int main()

成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。因為成員變數的初始化次序是根據變數在記憶體中次序有關,而記憶體中的排列順序早在編譯期就根據變數的定義次序決定了。在a類中,初始化順序是先n,在m,實際初始化順序為類中的排列順序先m,在n.

把初始化表改變建構函式:

a():q(5)//,n(0), m(n + 2)

結果:

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

類中static成員變數,必須在類外初始化。

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

總結:

變數的初始化順序就應該是:

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

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

3 基類的成員變數

4 派生類的成員變數

1.父類建構函式–>成員類物件建構函式–>自身建構函式

2.其中成員變數的初始化與宣告順序有關,建構函式的呼叫順序是類派生列表中的順序。

析構順序和構造順序相反。

例:class c: public a, public b,先構造a,在構造b

在有虛繼承和一般繼承存在的情況下,優先虛繼承

例:class c: public b, virtual public a 先構造a,在構造b

則先呼叫a的建構函式,再呼叫b的建構函式

**:

#include using namespace std;

class a

~a() {};

private:

int m;

int n;

static int p;

const int q;

int s = 1;

};class b :public a ;

~b() {};

private:

a a;

int m;

int n;

static int p;

const int q;

int s = 1;

};class c :public a, public b ;

~c() {};

private:

b b;

a a;

int m;

int n;

static int p;

const int q;

int s = 1;

};int a::p = 1;

int b::p = 1;

int c::p = 1;

int main()

c 初始化順序

c 構造函式呼叫順序 1.如果類裡面有成員類,成員類的建構函式優先被呼叫 2.建立派生類的物件,基類的建構函式優先被呼叫 也優先於派生類裡的成員類 3.基類建構函式如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序而不是它們在成員初始化表中的順序 4.成員類物件建構函式如果有多個成員類...

C 初始化順序

1 呼叫子類例項方法執行順序 子類靜態成員 只初始化一次 子類靜態建構函式 只執行一次 子類靜態方法 沒有使用時不呼叫 子類例項成員 父類靜態成員 只初始化一次 父類靜態建構函式 只執行一次 父類靜態方法 沒有使用時不呼叫 父類例項成員 父類例項建構函式 父類例項方法 沒有使用時不呼叫,包括例項屬性...

初始化順序

上次面試碰到一面試題,雖然知道但是感覺還是有必要記錄下來,利己利民,題目是關於初始化順序的,也許對很多初學者還是有點用處的。閒話不多說,先上 package initialseq public class parent public parent public int method package ...