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

C++中赋值与构造函数:为何下述代码中f2输出0?

为什么f2的输出是0?

这其实是C++中初始化和赋值两种场景下,初始化列表解析规则不同导致的,咱们一步步拆解:

先看f1的情况:Foo f1 = {};

这是拷贝初始化语法,这里的{}是用来初始化对象的初始化器。因为你没有提供任何具体值,编译器会匹配到你的默认构造函数Foo(),这个构造函数把x初始化为-1,所以f1.x输出-1完全符合预期。

再看f2的情况:f2 = {};

这是赋值操作,和初始化是完全不同的语法场景。这里的{}会被编译器优先解析为可以匹配赋值运算符的类型:

  • 你的类重载了operator=(int),而空初始化列表{}对于int类型来说,会触发值初始化,也就是把int初始化为0。
  • 所以这条语句等价于f2 = 0;,调用的是operator=(int),把f2.x设置为0,自然输出就是0了。

补充个小细节:如果你的类没有重载operator=(int),那f2 = {};会调用拷贝赋值运算符,此时{}会构造一个临时的Foo对象(用默认构造函数,x=-1),然后赋值给f2,那输出就会变成-1了。

内容的提问来源于stack exchange,提问作者user2736667

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:13