派生类对象构造函数的执行顺序:

  1. 先调用基类的构造函数
  2. 再执行“初始化列表”中所列出的数据成员的构造函数
  3. 最后执行派生类构造函数的函数体(指的是派生类构造函数的花括号内部的代码)

举个栗子:

1.先创建一个名为A的简单基类,里面包含一个构造函数和一个数据成员

1
2
3
4
5
6
class A {
private:
int a;
public:
A(int v) :a(v) {}
};

2.然后再用A类派生出一个B类,为了区分,我们将初始化列表分行表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B :public A {
private:
int b1;
A obj1;
A obj2;
int b2;

int b3;
public:
B(int v) :
b1(v),//1号
obj2(v),//2号
obj1(v),//3号
b2(v),//4号
A(v)//5号
{
b3 = v;//6号
}
};

3.在主函数中定义一个B类对象,来调用派生类B的构造函数

1
2
3
4
5
int main()
{
B obj(5);
return 0;
}

3.先用理论分析一波:
步骤一中“先调用基类的构造函数”:那么毋庸置疑,先执行5号代码A(v)调用基类的构造函数;

步骤二“再执行“初始化列表”中所列出的数据成员的“构造函数”。

这里需要特别注意,初始化列表中的执行顺序,是按照“数据成员的声明顺序”来赋值,而不是按照初始化列表的语句(1号→2号→3号→4号)来依次赋值的。

所以此步的赋值顺序是:1号(b1) → 3号(obj1) → 2号(obj2) → 4号(b2)

步骤三最后执行派生类构造函数的函数体:最后执行6号语句

4.建议复制代码,在编辑器上调试一下,看看执行顺序是怎样的

说了这么多,其实最主要的是步骤二,C++把子对象和基本类型的数据同等看待了


 评论

载入天数...载入时分秒...