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

Core List

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

class WebBrowser {

public:

    void clearEverything();    //  member 函数

}

void clearBrowser( WebBrowser& wb) {    //  non-member, non-friend 函数

    wb.clearCache();

    wb.clearHistory();

    wb.removeCookies();

}


2. non-member、non-friend 优于 member 的原因

(1) 封装性好

在两个函数提供相同机能的情况下,non-member、non-friend 函数不能访问 class 的 private 成员,相对于 member 函数有较高的封装性。

(2) 包裹弹性

non-member、no-friend 函数可以对 class 的任意函数进行打包,实现不同的功能,且独立于不同的头文件中。

由于 namespace 可以跨越多个源码文件而 class 不同,因此相关的机能可以声明在同一个头文件,每个头文件负责部分机能。

class 必须定义整体,不能被分割为片段,如果 class 的一个成员函数需要被使用,则整个 class 需要被编译包含进来。

(3) 机能扩充性

class 的定义对于客户而言是不可扩展的,但是 non-member、no-friend 函数可以被放在多个头文件内,但隶属于同一个命名空间,可以轻松扩展。

注:虽然我们可以通过派生类来扩展基类,但是我们也无法访问在基类中被封装的成员(private),且很多类被非设计用作基类。


结论:宁以non-member、non-friend 替换 member 函数做的目的是增加 “封装性”、“包裹弹性” 和 “机能扩展性”。


你可能感兴趣的:(Effective C++ 读书笔记 条款23:宁以non-member、non-friend 替换 member 函数)