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

关于C++类成员初始化列表中成员相互初始化输出差异的疑问

为什么两段C++初始化代码输出结果不同?

先看两段代码及对应输出:

第一段代码

class A{
public:
    int a=0;
    int b=0;
    A(int n):a(n),b(a){}
};
int main()
{
    A obj=5;
    cout<<obj.a<<obj.b;
}

输出:55

第二段代码

class A{
public:
    int a=0;
    int b=0;
    A(int n):b(n),a(b){}
};
int main()
{
    A obj=5;
    cout<<obj.a<<obj.b;
}

输出:05

核心原因:C++成员初始化顺序由声明顺序决定

你觉得两段代码逻辑相同,是误以为构造函数初始化列表的顺序就是成员的初始化顺序,但C++类成员的初始化顺序只取决于它们在类中的声明顺序,和初始化列表的书写顺序完全无关。

你的类A中,成员a的声明在b之前,所以不管初始化列表怎么写,一定是先初始化a,再初始化b。

第一段代码执行流程

  1. 按声明顺序先初始化a:用参数n=5直接初始化,a的值变为5(覆盖类内初始值0);
  2. 再初始化b:用已经完成初始化的a=5赋值,b的值变为5;
    最终两个成员都是5,输出55。

第二段代码执行流程

  1. 先初始化a:初始化器是b,但此时b还没开始初始化(因为b的初始化步骤在a之后)。这里的b属于未初始化的内置类型,值是未定义的——你看到的a=0只是编译器环境的巧合(比如栈内存默认清零),严格来说这是未定义行为;
  2. 再初始化b:用参数n=5赋值,b的值变为5;
    所以最终a的值不确定(这里是0),b是5,输出05。

这个规则是C++标准明确规定的,目的是避免因初始化列表顺序变化导致的依赖混乱,确保初始化行为的一致性。

内容的提问来源于stack exchange,提问作者蔡天意

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:17:15