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

思维导图笔记:

相关推荐
蒸蒸yyyyzwd几秒前
秋招学习笔记 Day 64 之准备系统软件开发工程师岗位笔记
c++·八股
奇树谦2 分钟前
LRU 缓存原理与 C++ 实践示例
开发语言·c++·缓存
toooooop84 分钟前
FastAdmin Hook 机制与插件错误透传:`$result` 之外的信封
开发语言·fastadmin
小马过河R28 分钟前
EdgeOne深度解析:从原理、适用场景到COS接入的技术逻辑
java·开发语言·前端·spring·cos
多弗朗皮卡丘36 分钟前
C++ 红黑树
开发语言·c++·红黑树
ZoeLandia1 小时前
TypeScript 04:类型断言与类型守卫
开发语言·前端·typescript
geovindu1 小时前
rust: pool Pattern
开发语言·后端·设计模式·rust·对象池简写模式
曼巴UE51 小时前
UE 属性同步
网络·c++·ue5
无忧.芙桃1 小时前
图的精髓:邻接矩阵与遍历全解析
c++·算法·面试·深度优先·广度优先
jimy11 小时前
标准的动态类型定义与“多态”无关,非多态对象同样会出现动态类型不同于静态类型的情形
开发语言·c++