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

Effective C++ 详解条款23:宁以non-member、non-friend替换member函数 总结: 宁可拿non-member non-friend函数替换member 函数。这样做可以增加封装性、包裹弹性(packaging flexibility)和机能扩充性。 举例:一个class用来表示网页浏览器。这样的class可能提供的众多函数中,有一些用来清除下载元素高速缓存区、清除访问过的URLS的历史记录、以及移除系统中的所有cookies: class webBrowser { public: ... void clearCache( ); void clearHisto 阅读详情

.
在C++中,宁以非成员函数、非友元函数替换成员函数,的设计原则是为了增强封装性、减少类之间的耦合,并提高代码的灵活性和可维护性。
这个原则的核心思想是,如果一个函数不需要直接访问类的私有或受保护成员,那么它应该被设计为非成员函数(non-member function),而不是成员函数(member function)

1、原因分析:

1.1、增强封装性:

  • 成员函数可以直接访问类的私有成员,这会增加类的暴露面,降低封装性。而非成员函数只能通过类的公共接口访问类的数据,这有助于保持类的封装性

1.2、减少耦合:

  • 非成员函数不依赖于类的内部实现细节,因为他们与类的耦合度较低。使的类的内部实现可以更容易地修改,而不会影响到使用该类的其他代码

1.3、提高灵活性:

  • 非成员函数可以更容易地被复用和组合。他们可以定义在命名空间中,而不是绑定到特定的类上,这使的他们可以在不同的上下文中使用。

1.4、扩展性:

  • 非成员函数可以在修改类的情况下添加新的功能,例如标准库中的算法(std::sort)就是非成员函数,他们可以应用与任何满足特定要求的类型。

2、代码示例
有一个坐标点类Point,现在需要实现一个函数来计算两个点的距离
2.1、使用成员函数的实现

  • distanceTo是一个成员函数,它可以直接访问类的私有成员x_和y_.
class Point {
public:
    Point(double x, double y) : x_(x), y_(y) {}

    double distanceTo(const Point& other) const {
        double dx = x_ - other.x_;
        double dy = y_ - other.y_;
        return std::sqrt(dx * dx + dy * dy);
    }

private:
    double x_;
    double y_;
};

2.2、使用非成员函数的实现

  • distance是非成员函数,通过Point类的公共接口访问点x,y坐标,Point类的封装性得到了保持。
class Point {
public:
    Point(double x, double y) : x_(x), y_(y) {}

    double getX() const { return x_; }
    double getY() const { return y_; }

private:
    double x_;
    double y_;
};

double distance(const Point& p1, const Point& p2) {
    double dx = p1.getX() - p2.getX();
    double dy = p1.getY() - p2.getY();
    return std::sqrt(dx * dx + dy * dy);
}

思维导图笔记:
请添加图片描述

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度 AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。 阅读详情

相关推荐

F28335 DSP ePWM模块实战:从基础配置到电机控制

本文详细解析了TI TMS320F28335 DSP的ePWM模块,从基础概念、寄存器配置到实战应用。通过代码示例,手把手教你如何配置定时中断、生成PWM波形、实现死区保护与故障联防,并最终完成一个可调速、可换向的直流电机控制项目,是掌握F28335电机控制核心技术的实战指南。

g5h6i的博客 1128

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

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款23:宁以non-member、non-friend替换member函数 Prefer non-member non-friendfunctionsto member functions. 本条款讨论的还是封...

HakunaMatata的博客 329

不止于算力:深入鲲鹏920的片上网络(NoC)与一致性协议HCCS,看华为如何优化数据流转

本文深入解析了鲲鹏920处理器的片上网络(NoC)架构和一致性协议HCCS,揭示了华为如何通过创新的环总线设计和私有协议优化数据流转效率。文章详细介绍了鲲鹏920在多die、多芯片环境下的高效协同机制,包括环总线架构、HCCS协议精妙设计及物理实现创新,为云服务场景提供了高性能解决方案。

weixin_30681121的博客 253

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

条款 -23 宁以 non-member、non-friend 替换 member 函数 Remember: 1-宁可拿 non-member 、 non-friend 函数替换 member 函数。 ​ 这样做可以增加封装性、包裹弹性(packaging flexibility) p.s. non-member函数: ​ 不是类的成员(member)函数。通过具体类实现调用 eg. (类 A) …… void fun1(A& name1){ name1.a();

GaoJuno23的博客 373

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

xu_white的博客 7583

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1038

Effective C++ 学习笔记 条款23 宁以non-member、non-friend替换member函数

如果你要在一个member函数(它不只可以访问class内的private数据,也可以取用private函数、enums、typedefs等等)和一个non-member non-friend函数(它无法访问上述任何东西)之间做抉择,而且两者提供相同机能,那么,导致较大封装性的是non-member non-friend函数,因为它并不增加“能够访问class内之private成分”的函数数量。面向对象守则要求,数据以及操作数据的那些函数应该被捆绑在一块,这意味它建议member函数是较好的选择。

tus00000的博客 820

DAF-Net:动态注意力红外-可见光图像融合

DAF-Net 红外-可见光融合链路:IR/VIS 双分支 (Conv+ResBlock → 64ch) → DynamicAttentionFusion (Cat→Sigmoid→加权) → 重建 (Conv→Sigmoid)。TNO 上 SSIM=0.782 (vs IR), 0.734 (vs VIS), 参数量仅 218K。核心贡献:轻量动态注意力门控, 无监督 SSIM+MSE 损失不需要配准 ground truth。

FJN110的博客 320

C/C++编程:宁以non-member、non-friend替换member函数

引入 想象有个类用来表示网页浏览器。这样的类可能提供的众多函数中,有一些用来清除下载元素高速缓冲器、清除访问过的URLs的历史记录,以及移除系统中的所有cookies: class WebBrower{ public: void clearCache(); void clearHistory(); void removeCookies(); }; 很多用户想一整个执行所有的这些动作,因此webBrowser也提供这样一个函数: class WebBrower{ public: void clear

OceanStar的博客 1676

小目标检测之改进的YOLOV11算法

MASF-YOLO通过多尺度特征聚合注意力增强自适应融合三大核心创新,显著提升了无人机视角下的小目标检测性能。

hasakie的博客 1719

【华为OD机试真题】7、字符串筛选排序 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母(k>=1) 输出该字母所在字符串中的位置索引(字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引 如果有重复字母则输出字母的最小位置索引

KJ.JK 2267

读书笔记 effective c++ Item 23 宁可使用非成员非友元函数函数也不使用成员函数...

1. 非成员非友元好还是成员函数好? 想象一个表示web浏览器的类。这样一个类提供了清除下载缓存,清除URL访问历史,从系统中移除所有cookies等接口:   1 class WebBrowser { 2 3 public: 4 5 ... 6 7 void clearCache(); 8 9 void clearHistory(); 10 11 void r...

HarlanC的专栏 262

04-协议基础03:USB 2.0信号与电气特性

USB 2.0使用两根差分信号线D+/D-进行数据传输,支持低速(1.5Mbps)、全速(12Mbps)和高速(480Mbps)三种速率。USB总线为主从模式,所有事务由Host发起。端电阻值作用HostRpd(D+)15KΩ±5%下拉,默认低电平HostRpd(D-)15KΩ±5%下拉,默认低电平全速设备Rpu(D+)1.5KΩ±5%上拉到3.3V,标识全速低速设备Rpu(D-)1.5KΩ±5%上拉到3.3V,标识低速USB 2.0硬件要点。

内核笔记 105

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

探索 C++ 封装性最大化的设计哲学,理解为何 non-member non-friend 函数往往优于 member 函数

凡人叶枫的博客 219

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

【代码】Effective C++ 条款 23:宁以 non-member、non-friend 替换 member 函数。

weixin_42255569的博客 337

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

Effective C++条款23:宁以 non-member、non-friend替换member函数(Prefer non-member non-friend functions to member functions)

CltCj的博客 492

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

假如有一个以下的类,用来表示网页浏览器,其中有一些函数用来清除下载元素高速缓冲区、清楚访问过的URLs的历史记录、以及移除系统中的所有cookies: class WebBroswer { public: ... void clearCache(); void clearHistory(); void removeCookies(); ... }; 许多用户想一次性执行所有这些动作,因...

qq_44800780的博客 203

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

(一) 有个class来表示网页浏览器: class WebBrowser { public: void clearChache(); void clearHistory(); void removeCookies(); }; 很多用户会想一整个运行全部这些动作,因此W...

weixin_30914981的博客 108

Effective C++ 条款23_宁以 non-member、non-friend 替换 member 函数_不止于此

Prefer non-member non-friend functions to member functions 想象有个 class 用来表示网页浏览器。这样的 class 可能提供的众多函数中,有一些用来清除下载元素高速缓存区(cache of download elements)、清除访问过的 URLs 的历史记录(history of visited URLs)、以及移除系统中的所有cookies: class WebBrowser{ public: ... void clearCache(

嘟嘟的博客 240

读书笔记《Effective C++》条款23:宁以non-member、non-friend替换member函数

先看个例子,想象有个class用来表示网页浏览器。这样的class可能提供的众多函数中,有一些用来清楚下载元素告诉缓存区、清楚访问过的URLs的历史记录、以及移除系统中的所有cookies: class WebBrowser { public: void clearCache(); void clearHistory(); void removeC

Do-Program的专栏 296

Effective C++条款23——宁以non-member、non-friend替换member函数(设计与声明)

如果要你在一个member函数(它不只可以访问class内的private数据,也可以取用private函数、enums、 typedefs等等)和一一个non-member,non-friend函数(它无法访问.上述任何东西)之间做抉择,而且两者提供相同机能,那么,导致较大封装性的是non-member non-friend函数,因为它并不增加“能够访问class内之private成分”的函数数量。面向对象守则要求,数据以及操作数据的那些函数应该被捆绑在一块,这意味它建议member函数是较好的选择。

StudyWinter的博客 578

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

有个class来表示网页浏览器: class WebBrowser { public: void clearChache(); void clearHistory(); void removeCookies(); protected: private: }; 许多用户会想一...

weixin_30402085的博客 83

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

Core List 1. 相同行为的 member 和 non-member 实现 class

489

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

宁可拿non-member non-friend函数替换member函数。这样做可以增加封装性、包裹弹性(packaging flexibility)和机能扩充性。 转载于:https://www.cnblogs.com/wen-ge/p/4328423.html...

weixin_30483013的博客 73

Effective C++ T23:宁以non-member、non-friend替换member函数

1. 宁可拿non-member、non-friend 函数替换member函数。这样做可以增加封装性、包裹弹性和机能扩充性。 2. 将所有便利函数放在多个头文件内但隶属同一个命名空间(namespace),这是C++标准程序库的组织方式。

Ref.Ptr.的博客 612

【穿越Effective C++】23.宁以non-member、non-friend替换member函数

这个条款揭示了C++软件设计的一个重要原则:通过使用非成员非友元函数来最大化类的封装性。这种方法不仅减少了类接口的复杂度,还提高了代码的可维护性和可扩展性,是构建模块化软件系统的关键策略

沐怡旸的专栏 1164
上一篇: [Effective C++]条款22:将成员变量声明为private
下一篇: [Effective C++]条款24:若所有参数皆需类型转换,请为此采用non-menber函数
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值