关于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。
第一段代码执行流程
- 按声明顺序先初始化
a:用参数n=5直接初始化,a的值变为5(覆盖类内初始值0); - 再初始化
b:用已经完成初始化的a=5赋值,b的值变为5;
最终两个成员都是5,输出55。
第二段代码执行流程
- 先初始化
a:初始化器是b,但此时b还没开始初始化(因为b的初始化步骤在a之后)。这里的b属于未初始化的内置类型,值是未定义的——你看到的a=0只是编译器环境的巧合(比如栈内存默认清零),严格来说这是未定义行为; - 再初始化
b:用参数n=5赋值,b的值变为5;
所以最终a的值不确定(这里是0),b是5,输出05。
这个规则是C++标准明确规定的,目的是避免因初始化列表顺序变化导致的依赖混乱,确保初始化行为的一致性。
内容的提问来源于stack exchange,提问作者蔡天意
相关产品推荐
相关产品推荐

