我对以下C++类构造与赋值代码的运行逻辑理解是否正确?
你的两个结论都是完全正确的,我们可以逐段验证:
第一段代码逻辑验证
你给出的三步运行逻辑完全符合C++标准规定的执行流程:
- 第一步:
iop o;触发无参构造函数执行,创建栈上对象o - 第二步:
o = 8执行时,因为你的iop(int)构造函数没有声明explicit,允许int到iop的隐式类型转换:- 先调用
iop(int)构造函数生成一个临时右值对象 - 如果你使用的是C11及更高版本标准,会调用编译器默认生成的移动赋值运算符
operator=(iop&&);如果是C03及更早版本,会调用默认生成的拷贝赋值运算符operator=(const iop&),两种情况的最终执行效果和你总结的逻辑一致 - 赋值语句结束后,临时右值对象生命周期结束,触发析构
- 先调用
- 第三步:main函数退出前,栈上对象
o生命周期结束,触发析构
补充代码的结论验证
你对补充代码的理解也完全正确:
补充代码中iop o(5)直接调用带参构造函数创建对象o,输出第一个OK;o=8触发隐式类型转换生成参数为8的临时iop对象,输出第二个OK,后续赋值、临时对象析构、o析构的流程和第一段代码完全一致。最终你看到两行OK的输出,正好对应两个对象(原对象o、赋值用的临时对象)的构造过程,完全符合实际执行逻辑。
小提示:如果你不希望出现
o=8这种隐式类型转换的写法,只需要把iop(int y)的声明改为explicit iop(int y)即可,此时o=8会直接编译报错。
内容的提问来源于stack exchange,提问作者user17597436
相关产品推荐
相关产品推荐

