You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何可在类定义中直接初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:05:16