MST
星途 面试题库

面试题:C++对象成员初始化顺序的理解

假设有一个C++类如下:class A { int a; int b; public: A(int x, int y) : b(x), a(b + y) { } }; 请说明a和b的初始化顺序,并分析这样初始化是否存在问题,如果有,如何修改?
18.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 初始化顺序
    • 在C++中,类成员变量的初始化顺序是按照它们在类中声明的顺序进行的,而不是按照构造函数初始化列表中出现的顺序。
    • 对于类A,成员变量a先声明,然后是b,所以初始化顺序是先初始化a,再初始化b
  2. 分析是否存在问题
    • 存在问题。因为先初始化a,而a的初始化表达式a(b + y)b此时还未初始化(ba之后初始化),这会导致未定义行为。
  3. 修改方法
    • 调整成员变量的声明顺序,使ba之前声明,如下:
class A {
    int b;
    int a;
public:
    A(int x, int y) : b(x), a(b + y) {}
};
  • 或者在构造函数体中进行赋值操作(但一般不推荐这种方式,因为初始化列表效率更高,尤其对于对象成员和常量成员):
class A {
    int a;
    int b;
public:
    A(int x, int y) {
        b = x;
        a = b + y;
    }
};