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

.

在C++中,宁以非成员函数、非友元函数替换成员函数,的设计原则是为了增强封装性、减少类之间的耦合,并提高代码的灵活性和可维护性。

这个原则的核心思想是,如果一个函数不需要直接访问类的私有或受保护成员,那么它应该被设计为非成员函数(non-member function),而不是成员函数(member function)

1、原因分析:

1.1、增强封装性:

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

1.2、减少耦合:

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

1.3、提高灵活性:

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

1.4、扩展性:

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

2、代码示例

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

  • distanceTo是一个成员函数,它可以直接访问类的私有成员x_和y_.
cpp 复制代码
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类的封装性得到了保持。
cpp 复制代码
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);
}

思维导图笔记:

相关推荐
weixin_472339462 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击3 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue4 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
tan180°5 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
m0_555762905 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊6 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
彭祥.6 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk6 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼7 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
简佐义的博客7 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang