Декларація про друзів у C ++ - різниця між публічним та приватним


144

Чи є різниця між оголошенням функції / класу друга приватним або загальнодоступним? Я не можу знайти щось про це в Інтернеті.

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

class A
{
 public: 
      friend class B;
 };

і

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

Чи є різниця?


29
Така дезінформація ... хтось не заслужив бути другом. Цілком залежить від вас, чи подобаєтеся ви своїм друзям, прихованим своїми приватними особами.
Тоні Делрой

чи можу я запитати, що таке клас друзів: '(?
I Fhantasm I

3
@I Phantasm - це декларація, яка дозволяє екземпляру friendкласу отримати доступ до членів, оголошених privateу класі, який зробив декларацію. У цьому прикладі екземпляр класу B може отримати доступ до приватних членів класу A
BIU


2
Це питання заробило мені занадто багато балів на цьому сайті. Тоді все добре.
БІУ

Відповіді:


141

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


5
тож я здогадуюсь, хто мені сказав, що просто не знав, про що вони говорять. Дякую :)
BIU

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

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

для випадкового класу, так. Але скажіть, що ви реалізовуєте, operator==(T, T)використовуючи приватні дані членів T, і використовуєте friendяк деталі реалізації, щоб вони operator==могли відображатися як не члени. IMO, ця дружба не повинна з’являтися в загальнодоступному інтерфейсі (як буде породжено Doxygen, наприклад)
TemplateRex

Я прочитав деякий час тому тут, в stackoverflow, що деякі компілятори, я думаю, деякі старі баггі, заплутаються, якщо декларація про друзі відбудеться в непублічному регіоні.
Peregring-lk

36

Оскільки синтаксис friend class Bне оголошує члена класу A, тому не має значення, де ви його пишете, клас Bє другом класу A.

Крім того, якщо ви пишете friend class Bв protectedрозділі A, то це НЕ означає, що Bможуть звертатися тільки protectedі publicчлени A.

Завжди пам’ятайте, що колись Bстане другом A, він може отримати доступ до будь-якого учасника A, незалежно від того, в якому розділі ви пишете friend class B.


3
тож я здогадуюсь, хто мені сказав, що просто не знав, про що вони говорять. Дякую :)
BIU

-2

Декларація про друзі з'являється в тілі класу і надає функції або іншому класу доступ до приватних і захищених членів класу, де відображається декларація про друга.

Оскільки такі специфікатори доступу не впливають на значення дружніх декларацій (вони можуть з’являтися в приватних: або в публічних: розділах, без різниці).


Відповідаючи на запитання семирічки, не будучи новим. Будь ласка, відмовтеся від того, щоб зробити речі більш дублюючими.
MAChitgarha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.