C++重载+运算符时修改Baza类构造函数后求和结果异常
求和结果异常的核心原因
构造函数的额外加工逻辑未与求和的对象创建逻辑隔离,导致计算链路出现双重处理
- 原构造函数为纯透传逻辑:执行
a=x; b=y;,传入什么参数就存储什么值,无额外加工,此时求和时传入计算好的和值,结果符合预期 - 修改后的构造函数给a的赋值增加了固定偏移:执行
this->a = x + 5; this->b = y;,所有通过Baza构造函数创建的实例,a值都会比传入参数多5
可以通过实际执行的数值对照直观看到偏差来源:
修改构造函数后的实际执行流程:
- 创建obd1时传入参数(2,3):构造函数执行后,实际存储a=2+5=7,b=3
- 创建obd2时传入参数(4,5):构造函数执行后,实际存储a=4+5=9,b=5
- 求和时Suma函数计算得到a的和值为
7+9=16,b的和值为3+5=8,随后调用Baza(16,8)创建结果对象- 这次构造调用又触发了+5的偏移逻辑:最终a值为16+5=21,b值为8,和预期的原始值求和结果(2+4, 3+5)=(6,8)差异极大
常见修正方向
- 如果需求是「所有外部创建的Baza实例a比传入值多5,但求和对实际存储的a值计算、不再额外加工」:给Baza类增加一个不带偏移的内部构造重载,专门供Suma方法创建求和结果使用,避免触发公共创建逻辑的+5处理
- 如果需求是「对用户最初传入的原始参数做求和」:给类增加单独的成员变量存储原始的x、y值,不要只存储加工后的a、b属性,否则求和时拿到的已经是加过偏移的值,计算结果必然出错
内容的提问来源于stack exchange,提问作者VlAd TbK
相关产品推荐
相关产品推荐

