- 构造函数调用顺序:
- 当创建
B
类对象时,首先会调用基类A
的构造函数,然后再调用派生类B
的构造函数。这是因为派生类对象包含基类对象作为其一部分,在构造派生类对象之前,必须先构造其基类部分。
- 优化策略(以合理初始化成员变量提高效率为例):
#include <iostream>
class A {
public:
int dataA;
A(int a) : dataA(a) {
std::cout << "A constructor called" << std::endl;
}
};
class B : public A {
public:
int dataB;
// 使用成员初始化列表初始化基类部分和自身成员变量
B(int a, int b) : A(a), dataB(b) {
std::cout << "B constructor called" << std::endl;
}
};
int main() {
B b(10, 20);
return 0;
}
- 解释:
- 在上述代码中,
B
类构造函数使用成员初始化列表来初始化基类A
的成员变量dataA
和自身的成员变量dataB
。这样做可以避免先默认构造再赋值的额外开销。如果不使用成员初始化列表,而是在B
类构造函数体中给dataA
赋值,那么A
类对象会先被默认构造,然后再在B
类构造函数体中被赋值,这会带来额外的性能开销。通过成员初始化列表,可以直接在构造A
类对象时传入合适的值,同时也以高效的方式初始化B
类自身的成员变量,从而提高效率。