MST

星途 面试题库

面试题:C++中构造函数调用顺序优化之继承体系中的情况

假设有一个继承体系,基类Base和派生类Derived,Base有成员变量a,Derived有成员变量b。请写出代码示例展示它们构造函数的正常调用顺序,并阐述如何通过代码调整来优化这个调用顺序(例如通过成员初始化列表的合理使用)。
12.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

正常调用顺序代码示例

#include <iostream>

class Base {
public:
    int a;
    Base(int value) : a(value) {
        std::cout << "Base constructor called with a = " << a << std::endl;
    }
};

class Derived : public Base {
public:
    int b;
    Derived(int valueA, int valueB) : Base(valueA), b(valueB) {
        std::cout << "Derived constructor called with b = " << b << std::endl;
    }
};

int main() {
    Derived d(10, 20);
    return 0;
}

在上述代码中,构造函数的调用顺序是先调用Base的构造函数,再调用Derived的构造函数。

优化调用顺序(成员初始化列表的合理使用)

上述代码已经合理使用了成员初始化列表,这是一种优化方式。如果不使用成员初始化列表,在Derived构造函数体中给Base的成员变量a赋值,会先调用Base的默认构造函数,然后再进行赋值操作,这就多了不必要的构造和赋值开销。通过成员初始化列表直接传递参数给Base的构造函数,减少了额外的操作,从而优化了性能。

例如,如果Derived构造函数写成如下形式(不推荐):

Derived(int valueA, int valueB) {
    a = valueA;
    b = valueB;
    std::cout << "Derived constructor called with b = " << b << std::endl;
}

此时会先调用Base的默认构造函数(如果没有定义默认构造函数,这里会编译错误),然后再对a进行赋值,增加了开销。所以合理使用成员初始化列表,像最初示例那样,就是一种优化方式。