MST

星途 面试题库

面试题:C++ 委托构造中的成员初始化顺序

在 C++ 委托构造场景下,分析成员变量的初始化顺序,并说明当委托构造和成员初始化列表同时存在时,编译器如何处理。请通过代码示例进行详细说明。
18.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 成员变量初始化顺序
    • 在C++中,成员变量的初始化顺序取决于它们在类定义中的声明顺序,而不是初始化列表中的顺序。
    • 在委托构造场景下,这个规则依然适用。被委托的构造函数先执行成员变量的初始化,然后才执行委托构造函数自身的代码。
  2. 委托构造和成员初始化列表同时存在时编译器的处理
    • 当委托构造和成员初始化列表同时存在时,编译器会先处理成员初始化列表,然后执行被委托构造函数的代码。如果被委托构造函数也有成员初始化列表,它会先执行自己的成员初始化列表,再执行自身的函数体代码。
  3. 代码示例
#include <iostream>

class MyClass {
private:
    int a;
    int b;
public:
    // 基础构造函数
    MyClass(int value) : a(value) {
        std::cout << "Base constructor: a = " << a << std::endl;
    }

    // 委托构造函数
    MyClass() : MyClass(0) {
        std::cout << "Delegating constructor" << std::endl;
    }

    // 委托构造函数同时有成员初始化列表
    MyClass(int value1, int value2) : b(value2), MyClass(value1) {
        std::cout << "Delegating constructor with member init list: b = " << b << std::endl;
    }
};

int main() {
    MyClass obj1;
    MyClass obj2(1, 2);
    return 0;
}

在上述代码中:

  • MyClass(int value) 是基础构造函数,它初始化 a
  • MyClass() 是委托构造函数,它委托给 MyClass(int value) 构造函数,先初始化 a,然后执行自身输出语句。
  • MyClass(int value1, int value2) 是另一个委托构造函数,它先按照成员声明顺序初始化 a(通过委托 MyClass(int value)),再初始化 b,最后执行自身输出语句。输出结果为:
Base constructor: a = 0
Delegating constructor
Base constructor: a = 1
Delegating constructor with member init list: b = 2

这表明了成员变量按照声明顺序初始化,且委托构造和成员初始化列表同时存在时编译器的处理方式。