Meyers在他的着作Effective C++中提到,在某些情況下,非成員非友元函數比成員函數封裝得更好。什麼時候應該更喜歡非會員非朋友功能的會員功能?
例子:
// Web browser allows to clear something
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
...
};
許多用戶將要執行的所有這些行動起來,所以WebBrowser
也可能提供一個功能來做到這一點:
class WebBrowser {
public:
...
void clearEverything(); // calls clearCache, clearHistory, removeCookies
...
};
另一種方法是定義一個非會員非朋友功能。
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
非成員函數更好,因爲「它不會增加可以訪問類的私有部分功能的數量。」,從而導致更好的封裝。
像clearBrowser
函數是方便的功能因爲他們不能提供任何的功能在一些其他的方式WebBrowser
客戶端無法獲得已。例如,如果clearBrowser
不存在,則客戶可以自己調用clearCache
,clearHistory
和removeCookies
。
對我來說,便利功能的例子是合理的。但是非會員版擅長的時候除了便利功能還有什麼例子嗎?
更普遍的是,什麼時候使用什麼規則哪個是?
我認爲這個話題比宗教實際有更多的宗教信仰。 – PlasmaHH
任何類型的算法都從免費而不是成員中受益,因爲您可以將它們重用於更廣泛的對象。一個例子是添加到新標準中的免費'begin()'/'end()'函數(它允許你迭代靜態數組和容器)。 –
@PlasmaHH:我不認爲它更像是宗教。做一些非會員和非朋友的職能的理由非常合理。 – Nawaz