面试题答案
一键面试- 初始化顺序:
- 在C++中,类成员变量的初始化顺序是按照它们在类中声明的顺序进行的,而不是按照构造函数初始化列表中出现的顺序。
- 对于类
A
,成员变量a
先声明,然后是b
,所以初始化顺序是先初始化a
,再初始化b
。
- 分析是否存在问题:
- 存在问题。因为先初始化
a
,而a
的初始化表达式a(b + y)
中b
此时还未初始化(b
在a
之后初始化),这会导致未定义行为。
- 存在问题。因为先初始化
- 修改方法:
- 调整成员变量的声明顺序,使
b
在a
之前声明,如下:
- 调整成员变量的声明顺序,使
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;
}
};