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

思维导图笔记:

相关推荐
半桔4 分钟前
【算法深练】分组循环:“分”出条理,化繁为简
数据结构·c++·算法·leetcode·面试·职场和发展
万能程序员-传康Kk6 分钟前
智能教育个性化学习平台-java
java·开发语言·学习
道剑剑非道10 分钟前
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
开发语言·qt·ffmpeg
@残梦17 分钟前
129、QT搭建FFmpeg环境
开发语言·qt·ffmpeg
序属秋秋秋31 分钟前
《C++初阶之类和对象》【命名空间 + 输入&输出 + 缺省参数 + 函数重载】
开发语言·c++·笔记
C_Liu_42 分钟前
C语言:数据在内存中的存储
c语言·开发语言
武子康43 分钟前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
Kethy__1 小时前
算法分析与设计-动态规划、贪心算法
c++·学习·算法·贪心算法·动态规划
Code_流苏3 小时前
C++课设:学生成绩管理系统
c++·大作业·学生成绩管理系统·c++课设·期末课设
三两肉5 小时前
Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
java·开发语言·list·集合