Мейерс упомянул в своей книге «Эффективный 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
.
Мне кажется разумным пример вспомогательных функций . Но есть ли какой-либо другой пример, кроме удобной функции, когда версия, не являющаяся членом, превосходит?
В общем, каковы правила, когда использовать какие ?