Deklaracja znajomego w C ++ - różnica między publicznym a prywatnym

144

Czy istnieje różnica między deklarowaniem funkcji / klasy znajomego jako prywatnej lub publicznej? Nie mogę znaleźć nic na ten temat w Internecie.

Mam na myśli różnicę między:

class A
{
 public: 
      friend class B;
 };

i

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

Czy jest jakaś różnica?

BIU
źródło
29
Taka dezinformacja ... ktoś nie zasługiwał na przyjaźń. Tylko od Ciebie zależy, czy lubisz przyjaciół, którzy są wtuleni w szeregowych.
Tony Delroy
czy mogę zapytać, czym jest klasa przyjaciół: '(?
I Phantasm I
3
@I Phantasm - jest to deklaracja, która umożliwia instancji friendklasy dostęp do członków zadeklarowanych privatew klasie, która złożyła deklarację. W tym przykładzie instancja klasy B może uzyskać dostęp do prywatnych członków klasy A
BIU,
2
To pytanie przyniosło mi zbyt wiele punktów na tej stronie. W porządku.
BIU,

Odpowiedzi:

141

Nie, nie ma różnicy - po prostu powiedz, że klasa B jest przyjacielem klasy A i teraz ma dostęp do swoich prywatnych i chronionych członków, to wszystko.

ostry
źródło
5
więc wydaje mi się, że ktokolwiek mi powiedział, że po prostu nie wiedział, o czym mówią. Dzięki :)
BIU
ale do celów dokumentacyjnych, czy rozważyłbyś friendszczegół implementacji lub część interfejsu?
TemplateRex,
1
@TemplateRex: IMO to część interfejsu - to dość mocne twierdzenie, że jest kilka (losowych), class Friendktóre mogą uzyskać dostęp do wszystkich prywatnych członków bieżącej klasy.
ostry ząb
dla klas losowych, tak. Ale załóżmy, że implementujesz operator==(T, T)przy użyciu prywatnych członków danych Ti używasz friendjako szczegółów implementacji, aby operator==mogły wyglądać jako nie będące członkami. IMO, ta przyjaźń nie powinna pojawiać się w interfejsie publicznym (jak zostanie wygenerowana np. Przez Doxygen)
TemplateRex,
Jakiś czas temu przeczytałem tutaj w stackoverflow, że niektóre kompilatory, jak sądzę stare, zawierające błędy, będą zdezorientowane, jeśli deklaracja przyjaciela pojawi się w regionie niepublicznym.
Peregring-lk
36

Ponieważ składnia friend class Bnie deklaruje członka klasy A, więc nie ma znaczenia, gdzie ją napiszesz, klasa Bjest przyjacielem klasy A.

Ponadto, jeśli piszesz friend class Bw protectedsekcji A, NIE oznacza to , że masz Bdostęp tylko protectedi publicczłonków A.

Zawsze pamiętaj, że raz Bzostanie przyjacielem A, może uzyskać dostęp do każdego członka A, bez względu na to, w której sekcji piszesz friend class B.

Nawaz
źródło
3
więc wydaje mi się, że ktokolwiek mi powiedział, że po prostu nie wiedział, o czym mówią. Dzięki :)
BIU
-2

Deklaracja znajomego pojawia się w treści klasy i przyznaje funkcji lub innej klasie dostęp do prywatnych i chronionych elementów członkowskich klasy, w której pojawia się deklaracja znajomego.

Jako takie specyfikatory dostępu nie mają wpływu na znaczenie deklaracji znajomych (mogą pojawiać się w sekcjach prywatnych: lub publicznych: bez różnicy).

goyuiitv
źródło
Odpowiadając na pytanie, które ma siedem lat, nie będąc nowym. Proszę, odejdź od powielania rzeczy.
MAChitgarha