盡量用 non-member non-friend 函數替換 member 函數。 這能增加封裝性、包裝靈活性和功能擴展性。
class WebBrowser {
public:
void clearCache();
void clearHistory();
void removeCookies();
// 無 clearEverything!
};
// 非成員、非友元:只能通過 public 接口訪問
void clearBrowser(WebBrowser& wb) {
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
this 指針,**可訪問所有 private 成員**封裝性 = 能看到 private 內容的函數數量的倒數。方案 B 讓類的「信任圈」更小。
// 客戶代碼:無需修改庫代碼即可添加功能
namespace WebBrowserStuff {
void downloadImages(WebBrowser& wb, const std::vector<URL>& urls) {
// 使用 wb 的 public 接口實現
}
}
// 新函數與原有函數無縫整合,像原生一樣使用
WebBrowserStuff::downloadImages(browser, urls);
類對客戶**封閉擴展**(無法添加成員函數),命名空間對客戶**開放擴展**。
STL 將算法設計為 non-member 函數(std::sort, std::find, std::transform...),而非容器成員函數: