MST
星途 面试题库

面试题:C++继承体系下类成员初始化顺序

考虑以下C++代码: ```cpp class A { public: int m; A(int value) : m(value) { std::cout << "A constructor: m = " << m << std::endl; } }; class B : public A { public: int n; A innerA; B(int a, int b) : innerA(a + 1), n(b), A(a) { std::cout << "B constructor: n = " << n << std::endl; } }; ``` 当执行`B b(3, 4);`时,请详细说明构造函数的调用顺序以及成员变量`m`、`n`和`innerA.m`的初始化顺序,并解释输出结果。
35.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 构造函数调用顺序

    • 首先调用基类A的构造函数。因为B继承自A,在构造B对象时,会先构造其基类部分。这里调用A的构造函数A(int value),参数为3
    • 然后调用成员变量innerA的构造函数。这里调用A的构造函数A(int value),参数为3 + 1 = 4
    • 最后调用B自身的构造函数。
  2. 成员变量初始化顺序

    • 基类成员变量m,在基类A的构造函数中初始化,值为3
    • 成员变量innerA.m,在innerA的构造函数中初始化,值为4
    • 成员变量n,在B的构造函数初始化列表中初始化,值为4
  3. 输出结果解释

    • 首先输出A constructor: m = 3,这是基类A构造函数的输出,此时m被初始化为3
    • 接着输出A constructor: m = 4,这是成员变量innerA构造函数的输出,innerA.m被初始化为4
    • 最后输出B constructor: n = 4,这是B构造函数的输出,n被初始化为4

所以完整的输出为:

A constructor: m = 3
A constructor: m = 4
B constructor: n = 4