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

server/2024/12/28 22:16:26/

文章目录

    • 条款 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) {// 导航到指定 URLcurrentUrl_ = 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.ppmy.cn/server/154034.html

相关文章

vscode添加全局宏定义

利用vscode编辑代码时&#xff0c;设置了禁用非活动区域着色后&#xff0c;在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色&#xff0c;想查看代码不是很方便。如下图&#xff1a; 一 解决&#xff1a; 在vscode中添加全局宏定义。 二 步骤&#xff1a…

Java项目中Oracle数据库开发过程中相关内容

目录 1、连接数据库 2、创建用户和授权 3、统计的时候——把列变成行 4、Oracle12c数据库中&#xff0c;根据时间倒序返回最新一条数据 5、其他SQL相关记录 总结一些和Oracle相关的内容 1、连接数据库 使用oracle12c数据库自带的SQL Plus 链接数据库 打开SQL Plus工具&#xf…

头歌-边缘检测

第1关&#xff1a;边缘检测的基本原理与图像增强 任务描述 本关任务&#xff1a;理解边缘检测的基本概念&#xff0c;掌握 Roberts 算子的原理与操作。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.边缘检测的概念&#xff1b; 2. Roberts 算子的原理与操…

Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制

引言 在嵌入式开发中&#xff0c;构建效率直接影响项目的开发进度和质量。Yocto 项目通过其核心工具 BitBake 提供了灵活而强大的构建能力。然而&#xff0c;OpenEmbedded 构建系统的传统设计是从头开始构建所有内容&#xff08;Build from Scratch&#xff09;&#xff0c;这…

Linux 安装rpm

在Linux银河麒麟系统上安装RPM软件包&#xff0c;可以通过系统自带的RPM包管理工具来完成。以下是一个详细的安装步骤&#xff1a; 一、准备工作 下载RPM软件包&#xff1a; 从可靠的软件源或官方网站下载需要安装的RPM软件包。 打开终端&#xff1a; 需要通过终端&#x…

ChatGPT详解

ChatGPT是一款由OpenAI研发和维护的先进的自然语言处理模型&#xff08;NLP&#xff09;&#xff0c;全名为Chat Generative Pre-trained Transformer&#xff0c;于2022年11月30日发布。以下是对ChatGPT的详细介绍&#xff1a; ### 一、技术架构与原理 1. **技术架构**&…

JDK高频面试题(包重点)

一、什么是JDK JDK&#xff08;Java Development Kit&#xff09;即 Java 开发工具包&#xff0c;是 Java 编程的基础与核心&#xff0c;由 Sun Microsystems&#xff08;现归属于 Oracle 公司 &#xff09;开发&#xff0c;主要作用如下&#xff1a; 1、提供编译环境 它包含了…

京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分&#xff1a; 1. 平台产品能力介绍 2. 业务赋能案例分享 3. 平台建设挑战与展望 作者&#xff1a;梁臣 京东 数据产品架构师 01平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用…