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?


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.


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.


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).


Odpowiadając na pytanie, które ma siedem lat, nie będąc nowym. Proszę, odejdź od powielania rzeczy.
MAChitgarha
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.