为何可在类定义中直接初始化const成员变量?
关于类const成员变量初始化的疑问
我查阅了大量资料,得知必须使用初始化列表来初始化类的const成员变量,但我的代码却能正常编译并运行,代码及运行结果如下:
class myClass { public: myClass() { printf("Constructed %f\n", value); } ~myClass() { printf("Destructed %f\n", value); } const double value = 0.2; }; void test(const std::shared_ptr<myClass> &ptr) { std::cout << "in test function" << std::endl; std::cout << ptr->value << std::endl; } int main() { std::shared_ptr<myClass> ptr = std::make_shared<myClass>(); test(ptr); std::cout << "finished" << std::endl; }
输出
Constructed 0.200000 in test function 0.2 finished Destructed 0.200000
这是因为你的代码使用了C++11及之后的标准,该标准新增了非静态成员变量就地初始化的特性。
在C11之前,类的非静态const成员确实必须通过构造函数的初始化列表完成初始化;但从C11开始,允许在类定义中直接为非静态成员变量指定默认初始值,编译器会在构造函数执行的初始化阶段(早于构造函数体执行)完成这些成员的初始化,因此你的代码可以正常编译运行。
需要补充两个细节:
- 如果构造函数的初始化列表中也对该const成员进行了赋值,那么初始化列表的优先级会高于类内的就地初始化值,最终会使用初始化列表中的值。
- 这种就地初始化方式仅适用于非静态成员,静态成员的初始化规则不受此影响。
内容的提问来源于stack exchange,提问作者yingjie jiang
相关产品推荐
相关产品推荐

