C++ BankAccount类Transfer方法中AddMoney函数失效问题排查及代码优化咨询
问题根源与解决方案
嘿,我来帮你搞定这个转账不生效的问题!
核心问题:值传递导致的对象副本
你代码里的Transfer方法参数是BankAccount a,这是按值传递——也就是说,当你调用B2.Transfer(C1,50.0)时,函数里的a只是C1的一个副本,不是原对象。你在Transfer里修改a.balance,只会改变这个副本的余额,函数执行完副本就销毁了,原对象C1的余额根本没变化!
而你在main里直接操作balance时,是直接修改原对象的属性,所以能生效。
快速修复步骤
把Transfer的参数改成引用传递:
把方法声明和定义里的BankAccount a改成BankAccount& a,这样函数会直接操作原对象,而不是副本。同样,Transactions方法的参数也建议改成引用,避免不必要的对象拷贝。修复Transfer里重复加钱的错误:
你的Transfer函数里写了两次a.balance += b,这会导致目标账户被加两次钱,得删掉其中一次。恢复并使用AddMoney方法(封装最佳实践):
你把AddMoney注释掉了,还把balance设为public,这不符合封装原则。应该把balance改成private,通过AddMoney和DeductMoney来操作余额,这样能更好地控制数据的访问和修改逻辑。
修改后的关键代码片段
类声明部分
class BankAccount { // 所有成员变量设为private,封装起来 string name; int accno; float balance; // 移回private void DeductMoney(float); void Transactions(const BankAccount&, float); // 用const引用 public: void AddMoney(float); // 恢复AddMoney声明 BankAccount(string a, float b = 0); void Transfer(BankAccount&, float); // 改成引用传递 void Interest(float intrst = 0.18); void Display(void) const; // 加const,因为不修改成员变量 };
Transfer方法定义
void BankAccount :: Transfer(BankAccount& a, float b) { cout << "Transfering..." << endl; // 新增边界检查:余额不足时终止转账 if (balance < b) { cout << "Error: Insufficient balance for transfer!" << endl; return; } this->DeductMoney(b); a.AddMoney(b); // 调用封装的AddMoney,而非直接操作balance this->Transactions(a, b); }
恢复AddMoney方法
void BankAccount :: AddMoney(float e) { balance += e; cout << "Added " << e << " to account: " << name << endl; }
整体代码优化建议
除了修复转账问题,还有几个地方可以让代码更规范、安全:
- 规范main函数:C++标准要求
main返回int,所以写成int main()而不是main()。 - 安全生成随机账号:原来的
accno = rand();生成的随机数可能重复,且rand()安全性不足。可以用<random>库生成更可靠的随机数:#include <random> // 在构造函数内 std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(1000000, 9999999); // 生成7位账号 accno = dis(gen); - 避免全局using namespace std:全局使用
using namespace std容易引发命名冲突,建议在需要的地方用std::前缀,比如std::cout、std::string。 - 使用构造函数初始化列表:用初始化列表初始化成员变量,效率更高:
BankAccount(string a, float b = 0) : name(std::move(a)), balance(b) { // 随机账号生成代码放这里 } - 添加错误处理:比如判断转账金额是否为负数,避免非法操作。
- const成员函数:像
Display、Transactions这类不修改成员变量的方法,都应该声明为const,这样可以被const对象调用。
测试效果
修改完后运行代码,你会看到C1的余额从100变为150,B2的余额从200变为150,转账功能正常生效啦!
内容的提问来源于stack exchange,提问作者Atharva Bedekar
相关产品推荐
相关产品推荐

