当前位置: 首页 > article >正文

Effective C++ 条款 22:将成员变量声明为 private

文章目录

    • 条款 22:将成员变量声明为 private
      • 核心思想
      • 示例代码
      • 注意事项
      • 结论

条款 22:将成员变量声明为 private

核心思想

  1. 成员变量的封装性
    将成员变量声明为 private 是面向对象设计的重要原则,有助于保持封装性。

  2. 为何使用 private?

    • 访问的一致性:通过提供公共接口(如 getter 和 setter),可以统一访问逻辑。
    • 细致的访问控制:可以精确控制哪些操作允许客户执行,防止非法访问。
    • 保证约束条件:通过接口,可以确保成员变量的值总是符合约束条件。
    • 实现灵活性:可以随时修改内部实现,而无需更改外部接口。
  3. 避免使用 protected
    protected 并不比 public 更具封装性,因为派生类可以直接访问成员变量,破坏封装原则。


示例代码

class Person {
public:
    // 构造函数
    Person(const std::string& name, int age) 
        : name_(name), age_(age) {}
    
    // getter 和 setter
    const std::string& getName() const 
    	{ return name_; }
    void setName(const std::string& name)
    	{ name_ = name; }
    
    int getAge() const 
    	{ return age_; }
    void setAge(int age) {
        if (age >= 0) age_ = age;  // 确保年龄非负
    }

private:
    std::string name_;  // 姓名
    int age_;           // 年龄
};

注意事项

  1. 不要使用 public 或 protected 成员变量

    class Person {
    public:
        std::string name;  // 不推荐:破坏封装
        int age;           // 不推荐:外部可直接操作
    };
    
    • 问题:外界可以直接操作 nameage,导致对象可能进入非法状态。
    • 改进:将成员变量设为 private,并提供访问接口。
  2. 避免使用 protected 成员变量

    class Base {
    protected:
        int data;  // 不推荐:派生类可以直接访问
    };
    
    • 问题:派生类可直接操作 data,破坏封装,增加错误风险。
    • 改进:将成员变量设为 private,派生类通过基类的公共接口访问。

结论

  1. 始终将成员变量声明为 private,以保护封装性。
  2. 使用公共接口(getter 和 setter)控制成员变量的访问。
  3. 避免使用 protected 成员变量,因为它破坏封装原则。
  4. 通过良好的封装设计,可以提高代码的健壮性和可维护性。

http://www.kler.cn/a/453757.html

相关文章:

  • SpringBoot的MVC接口增加签名
  • workman服务端开发模式-应用开发-后端api推送修改二
  • UDP Ping程序实现
  • 学籍管理系统:实现教育管理现代化
  • 【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
  • 敏捷开发05:Sprint Planning 冲刺计划会议详细介绍和用户故事拆分、开发任务细分
  • Kalilinux下MySQL的安装
  • 探索数据采集
  • 大数据学习之Redis 缓存数据库二,Scala分布式语言一
  • Keil-编译按钮Translate,Build,Rebuild
  • 【203】实验室管理系统
  • 实用工具推荐----Doxygen使用方法
  • 【信息系统项目管理师】第12章:项目质量管理-基础和过程 考点梳理
  • JS中的原型与原型链
  • scala基础学习(数据类型)-数组
  • stm32引脚模式GPIO
  • 5G 模组 上位机驱动开发流程
  • hiprint结合vue2项目实现静默打印详细使用步骤
  • 破解海外业务困局:新加坡服务器托管与跨境组网策略
  • golang, go sum文件保证下载的依赖模块是一致的