Menu
CoddyTech

回顾:银行账户管理器

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 33 课,共 104 课。

challenge icon

挑战

简单

让我们创建一个完整的银行账户管理器,将你在本章学到的所有类属性概念结合起来:带有获取器和设置器的私有成员、const 成员函数、mutable 成员、静态变量和方法,以及友元函数。

你将创建两个文件来整理代码:

  • BankAccount.h:定义一个用于管理账户数据并实现适当封装的 BankAccount 类。你的类应包含:
    • 私有成员:accountNumber(字符串)、ownerName(字符串)、balance(double),以及用于跟踪余额被查询次数的 mutable int queryCount
    • 用于跟踪现有账户数量的私有静态成员 totalAccounts
    • 一个接收账户号码、所有者姓名和初始余额的构造函数。它应将 queryCount 初始化为 0,并递增 totalAccounts
    • const 获取器:getAccountNumber()、getOwnerName() 和 getBalance():每次调用余额获取器时,都应递增 queryCount
    • 一个 const 获取器 getQueryCount(),用于返回余额被查询的次数
    • 一个 deposit(double amount) 方法,仅当金额为正数时才将其加到余额中
    • 一个 withdraw(double amount) 方法,仅当金额为正数且不超过当前余额时,才从余额中扣除该金额
    • 一个静态方法 getTotalAccounts(),用于返回已创建的账户总数
    • 声明一个友元函数 transfer(BankAccount& from, BankAccount& to, double amount),用于在账户之间转账。只有金额为正数且来源账户资金充足时,才应转账

    在类定义之后定义静态成员和友元函数。

  • main.cpp:演示如何将所有这些功能结合起来使用。从输入中读取两个所有者姓名和两个初始余额(共四行:name1、balance1、name2、balance2),然后:
    • 创建两个 BankAccount 对象,账户号码分别为 "ACC001" 和 "ACC002"
    • 打印 "Total accounts: <count>"
    • 打印第一个账户的 "<name>: $<balance>"
    • 打印第二个账户的 "<name>: $<balance>"
    • 向第一个账户存入 500.0
    • 打印第一个账户的 "After deposit - <name>: $<balance>"
    • 使用友元函数从第一个账户向第二个账户转账 300.0
    • 打印 "After transfer:"
    • 打印第一个账户的 " <name>: $<balance>"
    • 打印第二个账户的 " <name>: $<balance>"
    • 打印第一个账户的 "Query count for <name>: <count>"

使用 <iomanip> 中的 std::fixed 和 std::setprecision(2),将所有余额格式化为两位小数。使用 std::stod() 将字符串形式的余额输入转换为 double。

别忘了在头文件中添加头文件保护,并在需要的地方包含 <string> 和 <iostream>。

亲手试试

#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"

int main() {
    // 读取输入
    std::string name1, name2;
    std::string balance1Str, balance2Str;
    
    std::getline(std::cin, name1);
    std::getline(std::cin, balance1Str);
    std::getline(std::cin, name2);
    std::getline(std::cin, balance2Str);
    
    double balance1 = std::stod(balance1Str);
    double balance2 = std::stod(balance2Str);
    
    // 设置输出格式,保留 2 位小数
    std::cout << std::fixed << std::setprecision(2);
    
    // TODO: 创建两个 BankAccount 对象,账号分别为 "ACC001" 和 "ACC002"
    
    // TODO: 打印 "Total accounts: <count>"
    
    // TODO: 为第一个账户打印 "<name>: $<balance>"
    
    // TODO: 为第二个账户打印 "<name>: $<balance>"
    
    // TODO: 向第一个账户存入 500.0
    
    // TODO: 为第一个账户打印 "After deposit - <name>: $<balance>"
    
    // TODO: 使用友元函数从第一个账户向第二个账户转账 300.0
    
    // TODO: 打印 "After transfer:"
    
    // TODO: 为第一个账户打印 "  <name>: $<balance>"(注意前面有 2 个空格的缩进)
    
    // TODO: 为第二个账户打印 "  <name>: $<balance>"(注意前面有 2 个空格的缩进)
    
    // TODO: 为第一个账户输出 "Query count for <name>: <count>"
    
    return 0;
}

面向对象编程中的所有课

自己练习: C++ 在线编译器