Friend declaration in C++ - difference between public and private
Solution 1
No, there's no difference - you just tell that class B is a friend of class A and now can access its private and protected members, that's all.
Solution 2
Since the syntax friend class B
doesn't declare a member of the class A
, so it doesn't matter where you write it, class B
is a friend of class A
.
Also, if you write friend class B
in protected
section of A
, then it does NOT mean that B
can access only protected
and public
members of A
.
Always remember that once B
becomes a friend of A
, it can access any member of A
, no matter in which section you write friend class B
.
Solution 3
c++ has the notion of 'hidden friends': http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1601r0.pdf
Which only applies to friend functions that are defined inline. This make it so the functions can only be found via argument-dependent lookups, removing them from enclosing namespace.
Related videos on Youtube
BIU
Web Developer, Jerusalem !לא על אנש רחיצנא, ולא על בר אלהין סמיכנא. אלא באלהא דשמיא
Updated on May 11, 2021Comments
-
BIU about 3 years
Is there a difference between declaring a friend function/class as private or public? I can't seem to find anything about this online.
I mean the difference between:
class A { public: friend class B; };
and
class A { private: //or nothing as the default is private friend class B; };
Is there a difference?
-
Tony Delroy about 13 yearsSuch misinformation... someone didn't deserve to be a friend. It's entirely up to you whether you like your friends tucked in with your privates.
-
BIU about 13 years@I Phantasm - it's a declaration that allows an instance of the
friend
class to access the members declaredprivate
in the class that made the declaration. In the case of this example, an instance of class B can access the private members of class A -
BIU over 10 yearsThis question has earned me way too many points on this site. All right then.
-
Suma
-
-
BIU about 13 yearsso I guess whoever told me that just didn't know what they were talking about. Thanks :)
-
BIU about 13 yearsso I guess whoever told me that just didn't know what they were talking about. Thanks :)
-
TemplateRex almost 10 yearsbut for documentation purposes, would you consider a
friend
an implementation detail or part of the interface? -
sharptooth almost 10 years@TemplateRex: IMO that's part of interface - it's quite a strong claim that there's some (random)
class Friend
which can access all private members of the current class. -
TemplateRex almost 10 yearsfor random class, yes. But say you implement
operator==(T, T)
using private data members ofT
, and usefriend
as an implementation detail so thatoperator==
can appear as a non-member. IMO, this friendship should not appear in the public interface (as will be generated by Doxygen e.g.) -
Peregring-lk almost 5 yearsI read some time ago here in stackoverflow that some compilers, I guess some old buggy ones, will get confused if a friend declaration happens within a non-public region.
-
MAChitgarha about 4 yearsAnswering a seven-year-old question without being new. Please take away from making things more duplicated.