0%

C++类对象的初始化顺序

构造函数调用顺序:

  • 按照派生类继承基类的顺序,即派生列表中声明的顺序,依次调用基类的构造函数;
  • 按照派生类中成员变量的声明顺序,依次调用派生类中成员变量所属类的构造函数;
  • 执行派生类自身的构造函数。

综上可知,类对象的初始化顺序:基类构造函数->派生类成员变量的构造函数->自身构造函数。

  • 基类构造函数的调用顺序与派生类的派生列表的顺序有关;
  • 成员变量的初始化顺序与声明顺序有关;
  • 析构顺序和构造顺序相反。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
using namespace std;

class A
{
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
};

class B
{
public:
B() { cout << "B()" << endl; }
~B() { cout << "~B()" << endl; }
};

class Test : public A, public B // 派生列表
{
public:
Test() { cout << "Test()" << endl; }
~Test() { cout << "~Test()" << endl; }

private:
B ex1;
A ex2;
};

int main()
{
Test ex;
return 0;
}
/*
运行结果:
A()
B()
B()
A()
Test()
~Test()
~A()
~B()
~B()
~A()
*/