How does the friend keyword (Class/Function) break encapsulation in C++?

Quote from C++ FAQ which I think describes the situation with friend and encapsulation very well.

No! If they’re used properly, they enhance encapsulation.

You often need to split a class in half when the two halves will have
different numbers of instances or
different lifetimes. In these cases,
the two halves usually need direct
access to each other (the two halves
used to be in the same class, so you
haven’t increased the amount of code
that needs direct access to a data
structure; you’ve simply reshuffled
the code into two classes instead of
one). The safest way to implement this
is to make the two halves friends of
each other.

If you use friends like just described, you’ll keep private things
private. People who don’t understand
this often make naive efforts to avoid
using friendship in situations like
the above, and often they actually
destroy encapsulation. They either use
public data (grotesque!), or they make
the data accessible between the halves
via public get() and set() member
functions. Having a public get() and
set() member function for a private
datum is OK only when the private
datum “makes sense” from outside the
class (from a user’s perspective). In
many cases, these get()/set() member
functions are almost as bad as public
data: they hide (only) the name of the
private datum, but they don’t hide the
existence of the private datum.

Leave a Comment