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