先来看两道题:
// 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