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

Effective C++ 条款 23:宁以 non-member、non-friend 替换 member 函数

文章目录

    • 条款 23:宁以 non-member、non-friend 替换 member 函数
      • 核心思想
      • 示例代码
      • 注意事项

条款 23:宁以 non-member、non-friend 替换 member 函数


核心思想

  1. 更高的封装性

    • non-member 函数不需要访问类的 private 或 protected 成员,减少对类实现的依赖,增强封装性。
  2. 更灵活的设计

    • 将功能从类内部移到类外部,功能模块更容易独立扩展,减少类的复杂性。
  3. 更强的可扩展性

    • non-member 函数可以与类的接口分离,使得类的使用更灵活,同时保留对类行为的控制。
  4. 使用命名空间组织代码

    • non-member 函数与相关类放在同一命名空间中,有助于逻辑关联性和代码可读性。

示例代码

namespace WebBrowserStuff {

class WebBrowser {
public:
    void navigateTo(const std::string& url) {
        // 导航到指定 URL
        currentUrl_ = url;
    }
    void display() const {
        std::cout << "Displaying: " << currentUrl_ << std::endl;
    }
private:
    std::string currentUrl_;  // 当前网址
};

// non-member 函数,清理浏览器
void clearBrowser(WebBrowser& wb) {
    wb.navigateTo("about:blank");
    std::cout << "Browser cleared." << std::endl;
}

} // namespace WebBrowserStuff

注意事项

  1. 非成员函数增强封装性

    • 非成员函数无法访问类的 private 和 protected 成员,促使接口设计更具一致性和清晰性。
  2. 避免滥用 friend 函数

    class WebBrowser {
    public:
        friend void clearBrowser(WebBrowser& wb); // 不推荐:滥用 friend
    };
    
    • 问题:friend 函数打破封装性,导致外部函数能直接访问类的私有成员。
    • 改进:尽量设计为非成员函数,避免直接访问类的内部实现。
  3. 使用命名空间组织代码

    • non-member 函数与其操作的类放在同一个命名空间,确保逻辑清晰。
    namespace WebBrowserStuff {
        class WebBrowser {...};
        void clearBrowser(WebBrowser& wb);  // non-member 函数
    }
    


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

相关文章:

  • IDEA 搭建 SpringBoot 项目之配置 Maven
  • 【无线传感网】物理层及MAC层
  • matlab 设计滤波器
  • 深入浅出 Spring (二)| 依赖注入(DI)、自动装配
  • Ubuntu 20.04.1 LTS搭建nginx + php7.4运行环境
  • LabVIEW冷却风机性能测试系统
  • 贝叶斯神经网络(Bayesian Neural Network)
  • NLP 中文拼写检测纠正论文 A Hybrid Approach to Automatic Corpus Generation 代码实现
  • 数据库系统原理复习汇总
  • 洛谷P1621 集合(c嘎嘎)
  • MMaudio AI:如何通过 AI 实现精准的视频到音频合成
  • 保护眼睛的小工具
  • ModelScope;Ollama搭建本地大模型
  • Linux下shell基本命令之grep用法及示例
  • 4.系统学习-集成学习
  • 容声606WILL养鲜冰箱发布,定义品质健康生活新标准
  • TCP 连接:三次握手与四次挥手
  • gazebo_world 基本围墙。
  • gitlab runner 实现 微信小程序自动化部署
  • Flutter 插件开发入门
  • frameworks 之 WMS添加窗口流程
  • 嵌入式开发 的循环实现
  • 牛客周赛 Round 66 E题 小苯的蓄水池(hard)
  • 【电路复习--选择题】
  • 【汇编】关于函数调用过程的若干问题
  • 选择排序cYuyan