能否举一个例子,对比封装前的程序和封装后的,讲一下怎么封装的
时间: 2024-12-09 20:26:06 浏览: 33
当然,让我们以一个简单的银行账户管理系统的例子来说明封装的重要性。首先我们来看非封装(裸露变量)版本:
```c
#include <stdio.h>
// 原始版本,未封装
typedef struct {
float balance;
char account_number[10];
} BankAccount;
void deposit(BankAccount *account, float amount) {
account->balance += amount;
printf("Deposited %f to account %s\n", amount, account->account_number);
}
void withdraw(BankAccount *account, float amount) {
if (amount <= account->balance) {
account->balance -= amount;
printf("Withdrawn %f from account %s\n", amount, account->account_number);
} else {
printf("Insufficient balance.\n");
}
}
int main() {
BankAccount user_account = {"1234567890", 1000.0};
deposit(&user_account, 500);
withdraw(&user_account, 2000); // 这里会出错,因为余额不足
return 0;
}
```
在这个版本中,`balance` 和 `account_number` 数据对外部公开,其他函数可以直接修改。
现在我们使用封装的方式改进这个例子:
```c
// 封装后的版本,使用结构体和方法
#include <stdio.h>
#include <stdbool.h> // 引入bool类型
typedef struct {
float balance;
char account_number[10];
bool is_open;
} Account;
// 提供账户操作的封装方法
void deposit(Account *account, float amount) {
if (amount > 0 && account->is_open) {
account->balance += amount;
printf("Deposited %f to account %s\n", amount, account->account_number);
} else {
printf("Invalid operation or account closed.\n");
}
}
void withdraw(Account *account, float amount) {
if (amount <= account->balance && account->is_open) {
account->balance -= amount;
printf("Withdrawn %f from account %s\n", amount, account->account_number);
} else {
printf("Insufficient balance or account closed.\n");
}
}
// 设置账户状态
void set_account_status(Account *account, bool open) {
account->is_open = open;
}
int main() {
Account user_account = {"1234567890", 1000.0, true};
deposit(&user_account, 500);
withdraw(&user_account, 2000); // 现在会检查余额和是否关闭
set_account_status(&user_account, false); // 关闭账户
return 0;
}
```
这里通过添加`is_open`字段和封装方法(如`set_account_status`),实现了对账户状态的控制,并避免了直接修改内部数据的风险。
阅读全文
相关推荐


















