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
相关产品推荐
相关产品推荐

