Meyers在他的书"Effective C++"中提到,在某些情况下,非成员非朋友函数比成员函数更好地封装.
例:
// Web browser allows to clear something
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
...
};
Run Code Online (Sandbox Code Playgroud)
许多用户希望一起执行所有这些操作,因此WebBrowser也可能提供一个功能:
class WebBrowser {
public:
...
void clearEverything(); // calls clearCache, clearHistory, removeCookies
...
};
Run Code Online (Sandbox Code Playgroud)
另一种方法是定义非成员非朋友函数.
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
Run Code Online (Sandbox Code Playgroud)
非成员函数更好,因为"它不会增加可以访问类的私有部分的函数的数量.",从而导致更好的封装.
喜欢的功能clearBrowser是方便的功能,因为他们不能提供任何功能的WebBrowser一些其他方式的客户端无法获得已.例如,如果clearBrowser不存在,客户可以只打电话clearCache,clearHistory和removeCookies他们自己.
对我而言,便利功能的例子是合理的.但是当非会员版本擅长时,除了便利功能之外还有其他例子吗?
更一般地说,什么时候使用哪些规则?