面试题答案
一键面试- 成员变量初始化顺序:
- 在C++中,成员变量的初始化顺序取决于它们在类定义中的声明顺序,而不是初始化列表中的顺序。
- 在委托构造场景下,这个规则依然适用。被委托的构造函数先执行成员变量的初始化,然后才执行委托构造函数自身的代码。
- 委托构造和成员初始化列表同时存在时编译器的处理:
- 当委托构造和成员初始化列表同时存在时,编译器会先处理成员初始化列表,然后执行被委托构造函数的代码。如果被委托构造函数也有成员初始化列表,它会先执行自己的成员初始化列表,再执行自身的函数体代码。
- 代码示例:
#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
这表明了成员变量按照声明顺序初始化,且委托构造和成员初始化列表同时存在时编译器的处理方式。