C 中類成員變數在初始化列表中的初始化順序

2022-03-11 03:17:15 字數 1709 閱讀 5263

引子:我們知道,c++中類成員變數的初始化順序與其在類中的宣告順序是有關的。

先看**:

1

class

testclass1

27 testclass1(const testclass1&)

8 testclass1& operator=(const testclass1&)

9 ~testclass1()

12};

1314

class

testclass2

1520 testclass2(const testclass2&)

21 testclass2& operator=(const testclass2&)

22 ~testclass2()

25};

2627

class

test

2832

private:33

testclass1 m_tc1;

34testclass2 m_tc2;

35 };

1

intmain()

2

程式結果為:

現象:先呼叫testclass1的建構函式,再呼叫testclass2的建構函式。

原因:在類test中,m_tc1變數宣告在m_tc2變數之前,故m_tc1在m_tc2之前初始化。

問題:在列表初始化的建構函式中,將m_tc2放在m_tc1之前,是否可以讓m_tc2在m_tc1之前初始化?

**設計

int

main()

執行結果為:

可以看到:仍然是testclass1的建構函式先被呼叫,testclass2的建構函式接著被呼叫。

結論:c++中類成員變數的初始化順序與其在類中的宣告順序是有關的,而與其在初始化列表中的順序無關。

再舉乙個例子:

然後我將**寫成這樣:

1

class

test26

private:7

testclass1 m_tc1;

8testclass2 m_tc2;9};

1011

intmain()

12

注意與之前**的差別:我們在初始化列表中只初始化了m_tc2,沒有動m_tc1。執行結果:

結果分析:在初始化test的物件t時,由於m_tc1的宣告順序在m_tc2的宣告順序之前,所以t會想要先初始化m_tc1,但是它在初始化列表中沒有找到初始化m_tc1的內容,於是它只好呼叫m_tc1的預設建構函式了,完成m_tc1的初始化後,再根據初始化列表中的內容初始化m_tc2。

C 類中成員變數初始化

c 類中成員變數包括主要四種 普通成員變數,常量成員變數,靜態成員變數,靜態常量成員變數 上述成員變數該如何初始化,注意不是賦值。由於普通成員變數和常量成員變數,每乙個類例項化,都乙份記憶體拷貝。c 規定成員變數在宣告 注意宣告與定義區別 時,不允許初始化,因此這些變數只能放在建構函式初始化列表中。...

初始化列表成員變數的初始化

對於以下程式 include using namespace std class base base b 0 a b int get a int get b int main 本想得到的結果是a,b都為90。但是實際結果卻是 4273046 90process returned 0 0x0 exec...

C 中成員變數的初始化

類成員變數的初始化對於初學者來說是乙個頭疼的問題,總是記不住 型別應該怎樣進行初始化。為了解決後顧之憂,今天就把類中所有型別的成員變數的初始化做乙個總結。首先,我們來看看c 的類中都有哪幾種型別的成員變數。class test 大概的型別就是這幾類,當然還有其他一些比如 int f int g co...