面试题答案
一键面试正常调用顺序代码示例
#include <iostream>
class Base {
public:
int a;
Base(int value) : a(value) {
std::cout << "Base constructor called with a = " << a << std::endl;
}
};
class Derived : public Base {
public:
int b;
Derived(int valueA, int valueB) : Base(valueA), b(valueB) {
std::cout << "Derived constructor called with b = " << b << std::endl;
}
};
int main() {
Derived d(10, 20);
return 0;
}
在上述代码中,构造函数的调用顺序是先调用Base
的构造函数,再调用Derived
的构造函数。
优化调用顺序(成员初始化列表的合理使用)
上述代码已经合理使用了成员初始化列表,这是一种优化方式。如果不使用成员初始化列表,在Derived
构造函数体中给Base
的成员变量a
赋值,会先调用Base
的默认构造函数,然后再进行赋值操作,这就多了不必要的构造和赋值开销。通过成员初始化列表直接传递参数给Base
的构造函数,减少了额外的操作,从而优化了性能。
例如,如果Derived
构造函数写成如下形式(不推荐):
Derived(int valueA, int valueB) {
a = valueA;
b = valueB;
std::cout << "Derived constructor called with b = " << b << std::endl;
}
此时会先调用Base
的默认构造函数(如果没有定义默认构造函数,这里会编译错误),然后再对a
进行赋值,增加了开销。所以合理使用成员初始化列表,像最初示例那样,就是一种优化方式。