1、封装
封装可以隐藏实现的细节,让使用者只能通过实现写好的访问方法来访问这些字段,这样一来我们只需要在这些方法中增加逻辑控制,限制对数据的不合理访问。方便数据检查,有利于于保护对象信息的完整性。便于修改,提高代码的可维护性。实现良好的封装,需要从两个方面考虑:
把字段(成员变量)和实现细节隐藏起来,不允许外部直接访问
把方法暴露出来,让方法控制这些成员变量进行安全的访问和操作
所以,封装的含义是确保对用户隐藏敏感数据。为此,必须:
1)将类变量/属性声明为private
2)提供公共的get和set方法来访问和更新private
变量的值
3)使用示例
#include <iostream>
using namespace std;
class Car {
private:
// 私有成员变量,外部不能直接访问
string brand;
int speed;
public:
// 构造函数
Car(string b, int s) : brand(b), speed(s) {}
// 公共的 getter 函数,获取品牌
string getBrand() {
return brand;
}
// 公共的 setter 函数,设置品牌
void setBrand(string b) {
brand = b;
}
// 公共的 getter 函数,获取速度
int getSpeed() {
return speed;
}
// 公共的 setter 函数,设置速度
void setSpeed(int s) {
if (s >= 0) { // 保护速度,防止设置负数
speed = s;
} else {
cout << "Speed cannot be negative!" << endl;
}
}
// 成员函数,用于显示信息
void display() {
cout << "Car Brand: " << brand
<< ", Speed: " << speed << " km/h" << endl;
}
};
int main() {
// 创建 Car 类的对象
Car myCar("Toyota", 120);
// 使用公共接口访问数据
cout << "Initial Car Info:" << endl;
myCar.display();
// 修改对象属性
myCar.setSpeed(150);
myCar.setBrand("Honda");
// 查看修改后的数据
cout << "\nUpdated Car Info:" << endl;
myCar.display();
return 0;
}
2、get和set函数方法
private
变量只能在同一类中访问(外部类无法访问它)。 但是,如果我们提供公共的get和set方法,则可以访问它们。
get方法返回变量值,而set方法设置该值。
例如,
#include <iostream>
using namespace std;
class Employee {
private:
// 私有成员变量
int salary;
public:
// set方法
void setSalary(int s) {
salary = s;
}
// set方法
int getSalary() {
return salary;
}
};
int main() {
Employee myObj;
myObj.setSalary(50000);
cout << myObj.getSalary();
return 0;
}
3、封装的好处
封装的好处主要体现在数据保护、代码简化以及提高维护性等方面。通过封装,C++ 程序员能够更好地管理类的内部状态,使得代码更加健壮、易于维护和扩展。
#include <iostream>
#include <string>
using namespace std;
class BankAccount {
private:
// 私有数据成员,账户余额不能直接被外部访问
double balance;
public:
// 构造函数
BankAccount(double initial_balance) {
if (initial_balance >= 0) {
balance = initial_balance;
} else {
balance = 0; // 初始余额不能为负
cout
<< "初始余额不能为负"
<< endl;
}
}
// 公共方法:存款
void deposit(double amount) {
if (amount > 0) {
balance += amount;
cout << "存款 " << amount
<< ". 当前余额: "
<< balance << endl;
} else {
cout << "存款金额必须为正数。"
<< endl;
}
}
// 公共方法:取款
void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
cout << "取款 "
<< amount << ". 当前余额: "
<< balance << endl;
} else if (amount > balance) {
cout <<
"本次提款余额不足。"
<< endl;
} else {
cout
<< "提款金额必须为正。"
<< endl;
}
}
// 公共方法:查询余额
double getBalance() {
return balance;
}
};
int main() {
// 创建一个银行账户对象,初始余额为1000
BankAccount account(1000);
// 存款
account.deposit(500);
// 取款
account.withdraw(200);
// 查询余额
cout << "查询余额: "
<< account.getBalance() << endl;
// 尝试不合法的取款
account.withdraw(2000); // 提示余额不足
// 尝试不合法的存款
account.deposit(-100); // 提示存款金额必须为正
}
1)更好地控制类的属性和方法
2)可以将类属性设置为只读(如果仅使用get方法),也可以设置为只写(如果仅使用set方法)
3)更加灵活,程序员可以更改代码的一部分而不影响其他部分
4)增强数据安全性