C++ 中,封装是面向对象编程(OOP)的一项重要特性,它将数据和操作数据的方法封装在一个类中。封装通过访问修饰符来控制类成员的可访问性,封装在 C++ 中帮助实现了面向对象的四大基本原则之一(封装、继承、多态、抽象),它的核心思想是将数据和操作数据的方法结合在一起,从而提高了代码的安全性和灵活性。本文主要介绍C++ 面向对象 封装。

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)增强数据安全性

推荐文档