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. 封装的实际意义

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

  • 建立清晰的类接口契约

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

  • 降低模块间的耦合度

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

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

相关推荐
余额瞒着我当琳2 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
青少儿编程课堂2 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan3 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
多弗朗皮卡丘3 小时前
C++继承
c++·继承
汉克老师4 小时前
GESP2026年9月认证C++七级( 第三部分编程题(2、括号序列))精讲
c++·gesp·小学生·学c++编程
jimy15 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
潼心1412o6 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i7 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
wuminyu7 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
All for pursuit.7 小时前
【回溯-6】79.单词搜索
数据结构·c++·算法·leetcode