MST

星途 面试题库

面试题:C++类成员变量初始化的复杂场景分析

假设有一个C++类A,它包含一个const成员变量、一个引用成员变量和一个静态成员变量。请编写代码展示如何正确初始化这些成员变量,并且说明初始化顺序以及不同类型成员变量初始化的注意事项。同时,如果类A继承自另一个类B,基类B也有成员变量需要初始化,描述整个初始化过程的顺序。
43.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class B {
public:
    int bVar;
    B(int value) : bVar(value) {}
};

class A : public B {
private:
    const int constVar;
    int& refVar;
    static int staticVar;

public:
    A(int bVal, int& ref, int constVal) : B(bVal), constVar(constVal), refVar(ref) {
        staticVar++;
    }

    void printVars() {
        std::cout << "bVar: " << bVar << std::endl;
        std::cout << "constVar: " << constVar << std::endl;
        std::cout << "refVar: " << refVar << std::endl;
        std::cout << "staticVar: " << staticVar << std::endl;
    }
};

int A::staticVar = 0;

int main() {
    int num = 10;
    A a(5, num, 20);
    a.printVars();
    return 0;
}

初始化顺序

  1. 基类成员变量:首先初始化基类(B)的成员变量。在A的构造函数初始化列表中,B(bVal)用于初始化基类B的成员变量bVar
  2. 成员变量:按照声明顺序初始化派生类(A)的成员变量。这里先初始化constVar,再初始化refVar
  3. 静态成员变量:静态成员变量在类外初始化,并且只初始化一次。在上述代码中,int A::staticVar = 0;在类定义之外初始化staticVar

不同类型成员变量初始化注意事项

  • const成员变量:必须在构造函数的初始化列表中进行初始化,因为一旦对象构造完成,const变量的值就不能再改变。
  • 引用成员变量:同样必须在构造函数的初始化列表中初始化,因为引用必须在定义时绑定到一个对象,之后不能再重新绑定。
  • 静态成员变量:在类外进行初始化,并且不依赖于任何对象的创建。初始化时需要指定所属的类作用域(例如int A::staticVar = 0;)。

整个初始化过程顺序总结

  1. 调用基类构造函数,初始化基类成员变量。
  2. 按照在类中声明的顺序,初始化派生类的非静态成员变量。
  3. 执行派生类构造函数的函数体。
  4. 静态成员变量在类外初始化,在程序启动时初始化一次,不依赖于对象的创建过程。