Объявление друга в C ++ - разница между публичным и частным


151

Есть ли разница между объявлением функции / класса друга как частной или публичной? Я не могу найти ничего об этом в Интернете.

Я имею в виду разницу между:

class A
{
 public: 
      friend class B;
 };

а также

class A
{
 private: //or nothing as the default is private
      friend class B;
 };

Есть разница?


30
Такая дезинформация ... кто-то не заслуживает дружбы. Это полностью зависит от вас, нравятся ли вам ваши друзья, привязанные к вашим интимным вещам.
— Тони Делрой,


4
@I Phantasm - это объявление, которое позволяет экземпляру friendкласса получать доступ к членам, объявленным privateв классе, который сделал объявление. В случае этого примера экземпляр класса B может получить доступ к закрытым членам класса A
— BIU


2
За этот вопрос я получил слишком много баллов на этом сайте. Тогда все в порядке.
— BIU

Ответы:


147

Нет, нет никакой разницы - вы просто говорите, что класс B является другом класса A и теперь может получить доступ к его закрытым и защищенным членам, вот и все.


5
так что я предполагаю, что тот, кто сказал мне это, просто не знал, о чем они говорили. Спасибо :)
— BIU

но для целей документации вы бы рассмотрели friendдеталь реализации или часть интерфейса?
— TemplateRex

1
@TemplateRex: IMO, который является частью интерфейса - это довольно сильное утверждение, что есть некоторые (случайные), class Friendкоторые могут получить доступ ко всем частным членам текущего класса.
— острый зуб

для случайного класса, да. Но предположим, что вы реализуете operator==(T, T)использование частных данных-членов Tи используете friendв качестве детали реализации, чтобы она operator==могла отображаться как не-член. ИМО, эта дружба не должна отображаться в общедоступном интерфейсе (например, будет сгенерирована Doxygen)
— TemplateRex

Некоторое время назад я читал здесь, в stackoverflow, что некоторые компиляторы, я думаю, некоторые старые глючные, запутаются, если объявление друга происходит в закрытом регионе.
— Peregring-lk

37

Поскольку синтаксис friend class Bне объявляет член класса A, поэтому не имеет значения, где вы его пишете, класс B- друг класса A.

Кроме того, если вы пишете friend class Bв protectedразделе A, то это НЕ означает, что Bможно получить доступ только к членам protectedи . publicA

Всегда помните, что, Bстав другом A, он может получить доступ к любому члену A, независимо от того, в каком разделе вы пишете friend class B.


3
так что я предполагаю, что тот, кто сказал мне это, просто не знал, о чем они говорили. Спасибо :)
— BIU

-2

Объявление друга появляется в теле класса и предоставляет функции или другому классу доступ к закрытым и защищенным членам класса, в котором появляется объявление друга.

Таким образом, спецификаторы доступа не влияют на значение объявлений друзей (они могут отображаться в разделах private: или public: без разницы).


Отвечая на вопрос семилетней давности, не будучи новым. Пожалуйста, воздержитесь от дублирования.
— МАЧитгарха,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.