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?
friend
klasy dostęp do członków zadeklarowanychprivate
w 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 AOdpowiedzi:
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.
źródło
friend
szczegół implementacji lub część interfejsu?class Friend
które mogą uzyskać dostęp do wszystkich prywatnych członków bieżącej klasy.operator==(T, T)
przy użyciu prywatnych członków danychT
i używaszfriend
jako szczegółów implementacji, abyoperator==
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)Ponieważ składnia
friend class B
nie deklaruje członka klasyA
, więc nie ma znaczenia, gdzie ją napiszesz, klasaB
jest przyjacielem klasyA
.Ponadto, jeśli piszesz
friend class B
wprotected
sekcjiA
, NIE oznacza to , że maszB
dostęp tylkoprotected
ipublic
członkówA
.Zawsze pamiętaj, że raz
B
zostanie przyjacielemA
, może uzyskać dostęp do każdego członkaA
, bez względu na to, w której sekcji piszeszfriend class B
.źródło
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).
źródło