#include <iostream>
class B {
public:
int bVar;
B(int value) : bVar(value) {}
};
class A : public B {
private:
const int constVar;
int& refVar;
static int staticVar;
public:
A(int bVal, int& ref, int constVal) : B(bVal), constVar(constVal), refVar(ref) {
staticVar++;
}
void printVars() {
std::cout << "bVar: " << bVar << std::endl;
std::cout << "constVar: " << constVar << std::endl;
std::cout << "refVar: " << refVar << std::endl;
std::cout << "staticVar: " << staticVar << std::endl;
}
};
int A::staticVar = 0;
int main() {
int num = 10;
A a(5, num, 20);
a.printVars();
return 0;
}
初始化顺序
- 基类成员变量:首先初始化基类(
B
)的成员变量。在A
的构造函数初始化列表中,B(bVal)
用于初始化基类B
的成员变量bVar
。
- 成员变量:按照声明顺序初始化派生类(
A
)的成员变量。这里先初始化constVar
,再初始化refVar
。
- 静态成员变量:静态成员变量在类外初始化,并且只初始化一次。在上述代码中,
int A::staticVar = 0;
在类定义之外初始化staticVar
。
不同类型成员变量初始化注意事项
const
成员变量:必须在构造函数的初始化列表中进行初始化,因为一旦对象构造完成,const
变量的值就不能再改变。
- 引用成员变量:同样必须在构造函数的初始化列表中初始化,因为引用必须在定义时绑定到一个对象,之后不能再重新绑定。
- 静态成员变量:在类外进行初始化,并且不依赖于任何对象的创建。初始化时需要指定所属的类作用域(例如
int A::staticVar = 0;
)。
整个初始化过程顺序总结
- 调用基类构造函数,初始化基类成员变量。
- 按照在类中声明的顺序,初始化派生类的非静态成员变量。
- 执行派生类构造函数的函数体。
- 静态成员变量在类外初始化,在程序启动时初始化一次,不依赖于对象的创建过程。