C++类成员变量计算结果异常、方法内同公式计算正常问题求助
C++ 成员变量异常值问题原因与解决方案
核心原因
问题出在C++ 类成员的初始化顺序和构造函数的执行时机,具体执行流程如下:
- 类成员变量的初始化顺序完全按照声明顺序执行,且所有成员的初始化操作都会在构造函数体的代码执行前完成
- 你当前的构造函数是在函数体内给
place赋值,而num1的默认初始化器会在进入构造函数体之前就执行,此时place还没有被赋值,是未初始化的垃圾值,用垃圾值计算出的num1自然是异常结果 getInfo里直接计算能得到正确结果,是因为此时构造函数体已经执行完成,place已经被赋值为90,所以计算结果正确。
解决方案
方案1:使用成员初始化列表初始化成员
将构造函数的赋值逻辑移动到成员初始化列表,保证place在num1初始化前就被正确赋值:
// 修改构造函数即可 TestFunction(std::string userName, int userPlace) : name(userName), place(userPlace) { // 不需要再在函数体内赋值 }
因为成员声明顺序是name→place→num1,初始化列表会先完成name和place的赋值,再用正确的place值计算num1,结果就正常了。
方案2:直接在获取结果的方法中计算(更推荐)
如果结果完全依赖place的值,没必要将num1存储为成员变量,直接在getResult中计算即可,还能避免后续place修改后num1不同步的问题:
// 删掉private里的int num1成员,修改getResult方法 int getResult() { return place + (place / 10) * (place / 10); }
额外优化建议
尽量不要用pow函数计算整数的平方:pow是浮点数运算接口,存在精度误差风险(比如pow(9,2)有可能返回80.9999999999,转int时会被截断为80),直接用整数乘法(place/10)*(place/10)性能更高,结果也更准确。
内容的提问来源于stack exchange,提问作者Alleur
相关产品推荐
相关产品推荐

