Для чего используется ключевое слово «друг»?

11

Можете ли вы объяснить мне, почему friendключевое слово является предпочтительным для предоставления прав доступа к закрытым данным класса?

Dalton
источник
1
Если вы спросите, почему это friendбыло предпочтительным, какие другие способы вы обычно используете для доступа к данным частного класса извне?
Бенджамин Банье
@honk "Предпочитаемый" может быть неправильным словом для использования здесь. Я отредактировал большую часть поста, чтобы исправить грамматику и еще много чего, и я оставил исходный выбор слова, но я думаю, что здесь может быть языковой барьер.
Адам Лир
Не знаю, потому что сегодня случайно прочитал о друге. и в статье говорится, что если я не буду использовать друга, я создам монолитный класс.
Далтон

Ответы:

17

Friend - это классический способ расширения интерфейса класса.
Но самое замечательное в том, что друг явно задокументировал ваше намерение тесно связать определенные предметы с классом.

Примечание. Используя друга, вы жестко привязываете друзей к классу.

Прекрасным примером являются операторы потока в C ++

class Plop
{
    private:
        int  value;
        friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
        friend std::istream& operator>>(std::istream& stream, Plop&       data);
};

std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
     return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop&       data)
{
     return stream >> data.value;
}

Здесь мы расширяем открытый интерфейс класса Plop таким образом, который позволяет нам направлять объект в поток и из потока, но не подвергая внутреннюю реализацию или вызывая будущие трудности реализации, требуя использования методов get / set, которые должны поддерживаться (потому что они будут частью открытого интерфейса), даже если внутренняя реализация изменена.

Примечание. Это НЕ нарушает инкапсуляцию, но тесно связывает потоковые операторы с реализацией класса Plop (т.е. любое изменение в реализации класса Plop потребует изменения в реализации потоковых операторов). Но это ожидается. Все части открытого интерфейса (включая публичные / защищенные методы) тесно связаны с реализацией.

Но обратите внимание: вы явно задокументировали эту привязку как часть объявления класса.

Примечание: я бы не назвал друга предпочтительным способом раскрытия личных данных. Чрезмерное использование друга может быть так же плохо, как разоблачение реализации. Как и все языковые функции, его следует использовать разумно.

Мартин Йорк
источник
Если бы вы могли публично получить доступ к данным (например, через геттер), вы бы использовали вместо этого бесплатную функцию?
Иоанна