Когда я должен предпочесть функции, не являющиеся членами, не являющиеся друзьями, функциям-членам?

Мейерс упомянул в своей книге «Эффективный 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 .

Мне кажется разумным пример вспомогательных функций . Но есть ли какой-либо другой пример, кроме удобной функции, когда версия, не являющаяся членом, превосходит?

В общем, каковы правила, когда использовать какие ?

17
задан Nawaz 19 October 2011 в 12:35
поделиться