Объявление друга в 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: без разницы).

Goyuiitv
источник
Отвечая на вопрос семилетней давности, не будучи новым. Пожалуйста, воздержитесь от дублирования.
МАЧитгарха,