先來看兩道題:
// count algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::count
#include <vector> // std::vector
using namespace std;
class A {
public:A() { cout << "in A()" << endl; }
};class B {
public:B() { cout << "in B()" << endl; }B(int i) { cout << "in B(int i)" << endl; }
};class C {
public:C() { cout << "in C()" << endl; }
};class CC : public C {
public:CC() :b(10) { cout << "in CC()" << endl; }
public:A a;B b;
};int main()
{CC c;return 0;
}
答案:
in C()
in A()
in B(int i)
in CC()
請按任意鍵繼續. . .
再看另一道題:
// count algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::count
#include <vector> // std::vector
using namespace std;
class A
{
private:int n1;int n2;public:A() :n2(0), n1(n2 + 2){}void Print(){cout << "n1:" << n1 << ", n2: " << n2 << endl;}
};int main()
{A a;a.Print();return 1;
}
答案:
n1:-858993458, n2: 0
請按任意鍵繼續. . .
若改成:
// count algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::count
#include <vector> // std::vector
using namespace std;
class A
{
private:int n1;int n2;public:A() {n2 = 0;n1 = n2 + 2;}void Print(){cout << "n1:" << n1 << ", n2: " << n2 << endl;}
};int main()
{A a;a.Print();return 1;
}
答案:
n1:2, n2: 0
請按任意鍵繼續. . .
上面的例子告訴了我們一個事實:
類的初始化順序:基類--->成員------->構造函數內部
具體是:
1.先給基類分配內存
2.按照定義的先后順序初始化列表
3.進入類構造函數后執行構造函數內部的代碼
而且類成員變量的初始化順序以成員在類中的聲明為序, 而不管它在初始化成員列表的出現順勢。
?因此:
我們看第一個例子:
CC繼承自C,因此先調用C的構造函數,輸出“in C()”
然后CC中含有A,B兩個成員類,按照先后次序,分別初始化,調用A,B的構造函數,由于B有參數傳遞,所以調用顯式構造函數:
in A()
in B(int i)
最后執行CC構造函數內部的代碼
in CC()
第二個例子:
int n1;
int n2;public:A() :n2(0), n1(n2 + 2){}
定義時,規定了n1在前,n2在后,所以在初始化時亦執行此順序。故出現:
n1:-858993458, n2: 0
后面做了改造,則直接執行函數內部的代碼,按照順序,所以結果:
n1:2, n2: 0