C++ 封装

1. 封装概念

封装是面向对象编程的三大特性之一,将数据(成员变量)和操作数据的方法(成员函数)捆绑在一起,形成一个"类"。通过访问控制修饰符隐藏内部实现细节,仅暴露必要的接口。

2. 访问控制修饰符

  • public:公有成员,类外部可直接访问

  • private:私有成员,仅类内部可访问(默认)

  • protected:保护成员,类内部和派生类可访问

3. 基本实现示例

复制代码
复制代码
复制代码
class BankAccount {
private:
    double balance;          // 私有数据成员
    std::string accountNumber;
    
    bool isValidAmount(double amount) {  // 私有方法
        return amount > 0;
    }
    
public:
    // 公有接口
    BankAccount(std::string accNum, double initialBalance) 
        : accountNumber(accNum), balance(initialBalance) {}
    
    void deposit(double amount) {
        if (isValidAmount(amount)) {
            balance += amount;
        }
    }
    
    bool withdraw(double amount) {
        if (isValidAmount(amount) && amount <= balance) {
            balance -= amount;
            return true;
        }
        return false;
    }
    
    double getBalance() const {  // 只读访问
        return balance;
    }
};

4. 封装的优点

  • 数据隐藏:保护内部数据不被意外修改

  • 接口稳定:内部实现变化不影响外部调用

  • 易于维护:修改实现不影响使用该类的代码

  • 增强安全性:通过验证逻辑保证数据完整性

5. Getter/Setter 模式

复制代码
复制代码
复制代码
class Person {
private:
    std::string name;
    int age;
    
public:
    // Getter方法
    std::string getName() const { return name; }
    int getAge() const { return age; }
    
    // Setter方法(可添加验证逻辑)
    void setName(const std::string& newName) {
        if (!newName.empty()) {
            name = newName;
        }
    }
    
    void setAge(int newAge) {
        if (newAge >= 0 && newAge <= 150) {
            age = newAge;
        }
    }
};

6. 设计原则

  • 将数据成员设为private

  • 通过公有成员函数提供接口

  • 避免返回私有数据成员的引用或指针

  • 对需要修改的成员提供setter,对需要读取的成员提供getter

  • 构造函数用于初始化,避免在外部设置初始状态

7. 封装的实际意义

封装不仅仅是语法层面的数据隐藏,更重要的是:

  • 建立清晰的类接口契约

  • 分离"做什么"(接口)和"怎么做"(实现)

  • 降低模块间的耦合度

  • 提高代码的可测试性和可重用性

核心要点:通过封装,类的使用者只需要知道类能做什么,而不需要知道类如何做,这大大简化了代码的使用和维护。

相关推荐
CodeYp20197 分钟前
第16讲:set 和 map 的使用
开发语言·c++·set·map
傲世仙尊17 分钟前
vector起步与底层-三个指针迭代器失效与为模板升级内置类型
c++
誰能久伴不乏3 小时前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
choumin12 小时前
C++中万能引用与std::forward的作用和用法
c++·万能引用·std forward
下一站春风里13 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
努力努力再努力wz16 小时前
【C++高阶系列】C++20 协程底层原理:函数为什么能暂停?从状态机到 Task,彻底串起挂起、恢复与协程调度
开发语言·c++·c++20·1024程序员节
划破黑暗的第一缕曙光16 小时前
[C++]:4.模板
c++·template·模板·函数模版·类模版
十五年专注C++开发16 小时前
pybind11:一个跨C++和Python平台的编程库
开发语言·c++·python·pybind11
CodeYp201916 小时前
第11讲:stack 和 queue
开发语言·c++·queue·stack
沫璃染墨17 小时前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3