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 函数做的目的是增加 “封装性”、“包裹弹性” 和 “机能扩展性”。