目录
C++11 中类对象的初始化顺序较为复杂,涉及到基类、成员变量、静态成员等多方面,顺序一般为基类初始化,初始化列表,构造函数。当多个基类,初始化列表多个变量时,按照声明顺序。多个基类时,关注下虚基类优先的原则。
以下是对其初始化顺序的细化说明以及相应的例子。
静态优先
程序启动时,静态成员变量率先初始化,const 整型和 constexpr 类型若在类内初始化,于编译时完成;其他静态成员变量则需类外定义初始化。静态成员函数在程序加载时就绪,无特定初始化流程。
#include <iostream>
class StaticClass {
public:
static const int CONST_VALUE = 10; // 类内初始化const整型
static constexpr int CONSTEXPR_VALUE = 20; // 类内初始化constexpr类型
static int normalStaticVar; // 普通静态成员变量
static void staticFunc() {
std::cout << "Static function called" << std::endl;
}
};
int StaticClass::normalStaticVar = 30; // 类外初始化普通静态成员变量
int main() {
StaticClass::staticFunc();
std::cout << "CONST_VALUE: " << StaticClass::CONST_VALUE << std::endl;
std::cout << "CONSTEXPR_VALUE: " << StaticClass::CONSTEXPR_VALUE << std::endl;
std::cout << "normalStaticVar: " << StaticClass::normalStaticVar << std::endl;
return 0;
}
renhl252@renhl:~/usb/cplusplus$ make
g++ -g -std=c++11 main.cpp
./a.out
Static function called
CONST_VALUE: 10
CONSTEXPR_VALUE: 20
normalStaticVar: 30
renhl252@renhl:~/usb/cplusplus$
初始化顺序分析:
- 编译时初始化
CONST_VALUE和CONSTEXPR_VALUE:static const int CONST_VALUE = 10;:CONST_VALUE是const整型静态成员变量,由于在类内进行了初始化,编译器在编译阶段就能确定其值为10。static constexpr int CONSTEXPR_VALUE = 20;:CONSTEXPR_VALUE是constexpr类型的静态成员变量,同样在类内初始化,编译器在编译时会将其值初始化为20。
- 程序启动时初始化
normalStaticVar


2218

被折叠的 条评论
为什么被折叠?



