引子:我們知道,c++中類成員變數的初始化順序與其在類中的宣告順序是有關的。
先看**:
1class
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注意與之前**的差別:我們在初始化列表中只初始化了m_tc2,沒有動m_tc1。執行結果:class
test26
private:7
testclass1 m_tc1;
8testclass2 m_tc2;9};
1011
intmain()
12
結果分析:在初始化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...