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

Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)

一、主要观点

  • 在某些情况下,使用 non-membernon-friend 函数来替换 member 函数可以增强封装性和可扩展性,提供更好的软件设计。

二、详细解释

  1. 封装性

    • 类成员函数的封装性考量:成员函数可以访问类的 private 成员,这在一定程度上破坏了封装性。因为它拥有比实际所需更多的对类内部的访问权限。例如,对于一个类 Widget 的成员函数,它可以访问类的所有 private 数据成员和函数,即使某些数据或函数并不需要被该成员函数操作。
    • non-member、non-friend 函数的优势non-membernon-friend 函数只能通过类的 public 接口来访问类,这意味着它们不能直接访问类的 private 成员。这种方式可以将类的内部实现细节更好地隐藏起来,增强封装性。例如,对于一个处理 Widget 类对象的 non-membernon-friend 函数,它只能通过 Widget 类的 public 接口进行操作,不能访问 Widget 类内部的 private 成员,这样类的内部实现可以更加自由地修改而不影响这个外部函数。
  2. 可扩展性

    • 对类功能的扩展更灵活使用 non-membernon-friend 函数可以将不同的功能分布在不同的函数中,而不是将所有功能都集中在类的成员函数里。这样,当需要对类的功能进行扩展时,可以方便地添加新的 non-membernon-friend 函数,而不需要修改类的内部实现。
    • 命名空间的使用可以将相关的 non-membernon-friend 函数放在一个命名空间中,形成一个功能集合。这样可以更好地组织代码,并且可以根据不同的功能模块将函数分类到不同的命名空间中,方便代码的管理和维护。例如:
     
    namespace WidgetStuff {class Widget {... };void doSomething(Widget& w);void doAnotherThing(Widget& w);
    }
    
     

    这里,doSomething 和 doAnotherThing 是 non-membernon-friend 函数,它们通过 Widget 的 public 接口操作 Widget 类,当需要添加新的操作 Widget 的函数时,只需在 WidgetStuff 命名空间中添加即可,而不用修改 Widget 类。

  3. 编译依赖关系

    • 减少依赖member 函数的修改通常会导致类的重新编译,因为它是类定义的一部分。而 non-membernon-friend 函数的修改通常只需要重新编译该函数本身,减少了对类的依赖。这在大型项目中可以提高编译速度。
    • 降低耦合non-membernon-friend 函数与类的耦合度相对较低,使得类的接口更加稳定,避免因修改函数而影响类的内部实现和其他使用该类的代码。
  4. 示例说明

    • 考虑一个表示网页浏览器的类 WebBrowser,可能有清除缓存、清除历史记录、清除 Cookies 等操作。可以有两种实现方式:
     
    class WebBrowser {
    public:void clearCache();void clearHistory();void clearCookies();void clearEverything() {  // member functionclearCache();clearHistory();clearCookies();}
    };
    
     

    或者使用 non-membernon-friend 函数:

    class WebBrowser {
    public:void clearCache();void clearHistory();void clearCookies();
    };void clearEverything(WebBrowser& wb) {  // non-member, non-friend functionwb.clearCache();wb.clearHistory();wb.clearCookies();
    }
    
     

    在这个例子中,使用 non-membernon-friend 函数 clearEverything 可以将清除操作的功能与 WebBrowser 类分离,避免 WebBrowser 类变得臃肿,同时也不会增加 WebBrowser 类的封装性负担,因为 clearEverything 函数无法访问 WebBrowser 类的 private 成员。

三、总结

  • 为了实现更好的封装性、可扩展性、降低编译依赖和降低耦合度,在某些情况下,应该优先考虑使用 non-membernon-friend 函数而不是 member 函数。这有助于将类的功能分离,提高代码的可维护性和组织性,同时使类的内部实现更加独立和灵活。

相关文章:

Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)

一、主要观点: 在某些情况下,使用 non-member、non-friend 函数来替换 member 函数可以增强封装性和可扩展性,提供更好的软件设计。 二、详细解释: 封装性: 类成员函数的封装性考量:成员函数可以访问类的…...

云原生前端开发:打造现代化高性能的用户体验

引言:前端开发的新风向 在过去的几年中,前端开发领域经历了快速的演变,从早期的静态网页到如今复杂的单页应用(SPA),再到微前端架构和渐进式Web应用(PWA),前端技术一直处…...

循环队列(C语言版)

循环队列(C语言版) 1.简单介绍循环队列2.使用何种结构来实现3.基本结构4.初始化5.判空判满6.向循环队列插入一个元素7.从循环队列中删除一个元素8.获取队头队尾元素9.释放空间10.完整代码 🌟🌟hello,各位读者大大们你们好呀&#…...

考研408笔记之数据结构(五)——图

数据结构(五)——图 1. 图的基本概念 1.1 图的定义 1.2 有向图和无向图 在有向图中,使用圆括号表示一条边,圆括号里元素位置互换没有影响。 在无向图中,使用尖括号表示一条边,尖括号里元素位置互换则表示…...

没有公网IP实现seafile本地IP访问和虚拟局域网IP同时访问和上传文件

前言 Ubuntu 24.04 LTSDocker 安装 seafileOpenWrtTailscale Ubuntu 24.04 LTS 通过 docker desktop 安装 seafile 搭建个人网盘中,已经实现了本地局域网放问Ubuntu IP来访问Seafile,以及通过 Ubuntu 的 Tailscale IP 访问Seafile。但是,文…...

【Hadoop面试题2025】

文章目录 简单题故障及相应的处理方法中等难度高难度小文件小文件的产生小文件问题的影响小文件治理方案推荐方案 冷文件冷文件的产生冷文件问题的影响冷文件治理方案推荐方案 简单题 一、基础概念类 什么是Hadoop? 答案:Hadoop是一个开源的分布式计算框…...

2000-2010年各省第三产业就业人数数据

2000-2010年各省第三产业就业人数数据 1、时间:2000-2010年 2、来源:统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、第三产业就业人员数(万人) 4、范围:31省 5、指标解释:第三产业…...

第十一讲 多线程

多线程是提升程序性能非常重要的一种方式,也是Java编程中的一项重要技术。在程序设计中,多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一个线程,它们会交替执行,彼此间可以进行通信。 1. 进程与线…...

VUE之路由Props、replace、编程式路由导航、重定向

目录 1、路由_props的配置 2、路由_replaces属性 3、编程式路由导航 4、路由重定向 1、路由_props的配置 1)第一种写法,将路由收到的所有params参数作为props传给路由组件 只能适用于params参数 // 创建一个路由器,并暴露出去// 第一步…...

windows安装ES

1. 下载ES 访问ES官网下载Download Elasticsearch | Elastic 2. 配置环境变量 ES_JAVA_HOME : D:\jdk-17.0.9 ES_HOME : D:\elasticsearch-8.17.1-windows-x86_64\elasticsearch-8.17.1 3. 添加一些ES的配置 <1>关闭ES安全认证 打开elasticsearch-8.17.1\config\e…...

论文速读|Multi-Modal Disordered Representation Learning Network for TBPS.AAAI24

论文地址&#xff1a;Multi-Modal Disordered Representation Learning Network for Description-Based Person Search 代码地址&#xff1a;未开源&#xff08;2025.01.22&#xff09; bib引用&#xff1a; inproceedings{yang2024multi,title{Multi-Modal Disordered Repres…...

小哆啦解题记:加油站的奇幻冒险

小哆啦解题记&#xff1a;加油站的奇幻冒险 小哆啦开始力扣每日一题的第十三天 https://leetcode.cn/problems/gas-station/description/ 在环形道路上&#xff0c;矗立着一串加油站&#xff0c;宛如等待挑战的谜题。这条路上的每个加油站都有一桶汽油&#xff0c;而开车到下一…...

【前端】CSS实战之音乐播放器

目录 播放器背景旋转音乐封面按钮进度条音量调节音乐信息按钮的效果JavaScript部分播放和暂停音乐切换音乐信息进度条 音量调节避免拖拽时的杂音音量调节条静音和解除静音 自动下一首实现一个小效果最终效果 播放器背景 <div class"play_box"></div>设置…...

Games104——渲染中光和材质的数学魔法

原文链接 渲染方程及挑战 挑战 对于任一给定方向如何获得radiance–阴影 对于光源和表面shading的积分运算&#xff08;蒙特卡洛积分&#xff09; 对于反射光多Bounce的无限递归计算 基础光照解决方案 Blinn-Phong模型&#xff1a; 简化阴影 最常见的处理方式就是Shadow M…...

impala增加字段,hsql查不到数据

impala增加字段&#xff0c;插入数据后直接查看文件有值&#xff0c;impala查询是有值的&#xff0c;但是hsq查出来就没有值&#xff01; Parquet格式的表&#xff0c;在重命名表的列名&#xff0c;或新增列名后&#xff0c;查询重名的列数据时显示当前列所有值为NULL。 原因&a…...

SpringBoot项目中的异常处理

定义错误页面 SpringBoot 默认的处理异常的机制&#xff1a;SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicExceptionController 来处理/error 请求&#xff0c;然后跳转到…...

ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)尚待完善

AI修复老照片&#xff0c;试试吧&#xff0c;不一定好~~哈哈 2023年4月曾用过ComfyUI&#xff0c;当时就感慨这个工具和虚幻的蓝图很像&#xff0c;以后肯定是专业人玩的。 2024年我写代码去了&#xff0c;AI做图没太关注&#xff0c;没想到&#xff0c;现在ComfyUI真的变成了工…...

NLTK命名实体识别(NER)

命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)中的一项核心技术,旨在从文本中识别出具有特定意义的实体,如人名、地名、组织名等。通过对文本的自动化处理,NER能够帮助计算机理解和组织大量的非结构化数据,为信息抽取、搜索引擎优化、数据分析等领域…...

【游戏设计原理】78 - 持续注意力

这个原理指出&#xff0c;人类的注意力通常只能维持7至10分钟&#xff0c;因此游戏设计需要根据这一规律进行优化。具体建议包括&#xff1a; 短时间段设计&#xff1a;将游戏体验分解成7到10分钟的任务或场景&#xff0c;以符合玩家的注意力节奏。引入新刺激&#xff1a;在注…...

Android设备:Linux远程lldb调试

更多内容&#xff1a;XiaoJ的知识星球 目录 一、环境准备1.1 安装llvm/NDK1.2 开启lldb-server服务1.3 lldb连接lldb-server 二、使用lldb调试Android native源码2.1 运行调试2.2 .lldbinit文件 下面介绍Android设备&#xff08;Android手机为例&#xff09;&#xff0c;在Linu…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...