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

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

  • 建立清晰的类接口契约

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

  • 降低模块间的耦合度

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

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

相关推荐
葱卤山猪13 分钟前
C++17 联合体
开发语言·c++
不会C语言的男孩27 分钟前
C++ Primer Plus 第9章:内存模型和名称空间
开发语言·c++
愿天垂怜30 分钟前
【C++脚手架】gtest 单元测试库的介绍与使用
linux·服务器·c++·gitee·前端框架·gtest
小欣加油36 分钟前
leetcode 3300 替换为数位和后的最小元素
数据结构·c++·算法·leetcode
晚风予卿云月36 分钟前
【枚举】普通枚举
数据结构·c++·算法·竞赛·算法随笔
MR.欻38 分钟前
ZLMediaKit 源码分析(四):RTP/RTCP 协议栈实现分析
c++·人工智能·vscode·ffmpeg·音视频
郝学胜-神的一滴44 分钟前
Qt 高级开发 019:从零定制登录窗口按钮、Logo 样式与交互悬浮效果
开发语言·c++·qt·程序人生·交互·用户界面
YikNjy1 小时前
string(c++)
java·服务器·c++
汉克老师1 小时前
GESP6级C++考试语法知识(三十四、二叉搜索树(BST)(四、BST的退化))
c++·二叉搜索树·bst·gesp6级·gesp六级
y_m_h1 小时前
llvm介绍
c++