[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);
}

思维导图笔记:

相关推荐
fqbqrr3 分钟前
2607C++,使用微软detours勾挂工具
c++
人邮异步社区4 分钟前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大38 分钟前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai1 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜1 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa1 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
一次旅行1 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
mabing9933 小时前
Qt 生成条纹图
开发语言·qt
蓝悦无人机3 小时前
C++基础 — 函数总结
开发语言·c++