MST

星途 面试题库

面试题:C++中构造函数调用顺序的基础优化场景

假设有一个继承体系,基类A有一个构造函数,派生类B继承自A且也有构造函数。请描述在创建B类对象时,构造函数的调用顺序,并举例说明一种简单的优化这种调用顺序的策略,比如如何通过合理初始化成员变量来提高效率。
41.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 构造函数调用顺序
    • 当创建B类对象时,首先会调用基类A的构造函数,然后再调用派生类B的构造函数。这是因为派生类对象包含基类对象作为其一部分,在构造派生类对象之前,必须先构造其基类部分。
  2. 优化策略(以合理初始化成员变量提高效率为例)
    • 示例代码(C++)
#include <iostream>

class A {
public:
    int dataA;
    A(int a) : dataA(a) {
        std::cout << "A constructor called" << std::endl;
    }
};

class B : public A {
public:
    int dataB;
    // 使用成员初始化列表初始化基类部分和自身成员变量
    B(int a, int b) : A(a), dataB(b) {
        std::cout << "B constructor called" << std::endl;
    }
};

int main() {
    B b(10, 20);
    return 0;
}
  • 解释
    • 在上述代码中,B类构造函数使用成员初始化列表来初始化基类A的成员变量dataA和自身的成员变量dataB。这样做可以避免先默认构造再赋值的额外开销。如果不使用成员初始化列表,而是在B类构造函数体中给dataA赋值,那么A类对象会先被默认构造,然后再在B类构造函数体中被赋值,这会带来额外的性能开销。通过成员初始化列表,可以直接在构造A类对象时传入合适的值,同时也以高效的方式初始化B类自身的成员变量,从而提高效率。