... C++ offers even more flexible control over the visibility of member
objects and member functions. Specifically, members may be placed in the
public, private, or protected parts of a class. Members declared in the
public parts are visible to all clients; members declared in the private
parts are fully encapsulated; and members declared in the protected parts
are visible only to the class itself and its subclasses. C++ also supports
the notion of *friends*: cooperative classes that are permitted to see each
other's private parts.
-- Grady Booch, "Object Oriented Design with Applications"