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