D'après mon expérience, les cas où friend (ou mutable, qui est un peu similaire) améliore réellement l'encapsulation des données sont rares par rapport à la fréquence à laquelle il est utilisé pour casser l'encapsulation.
Elle m'est rarement utile, mais quand je l'utilise, c'est pour des cas où j'ai dû diviser une classe qui était auparavant une classe unique en deux classes distinctes qui doivent accéder à des données/fonctionnalités communes.
Modifier pour répondre au commentaire de Outlaw Programmer : Nous sommes tout à fait d'accord sur ce point. Une autre option, à part l'utilisation de classes amies après les avoir divisées, est de rendre les accesseurs publics, ce qui brise parfois l'encapsulation ! Je pense que certaines personnes pensent que les classes amies brisent en quelque sorte l'encapsulation parce qu'elles l'ont souvent vu utilisé de manière incorrecte, et beaucoup de personnes ne voient probablement jamais de code où il a été utilisé correctement, parce que c'est une chose rare. J'aime votre façon de le dire - la convivialité est un bon moyen terme entre ne pas vous permettre de diviser votre classe et rendre TOUT accessible au public.
Editer pour répondre à David Thornley : Je suis d'accord que la flexibilité que C++ vous permet de faire des choses comme ça est le résultat des décisions de conception qui ont été prises dans C++. Je pense que c'est ce qui rend encore plus important de comprendre ce qui est généralement un bon et un mauvais style dans les langages flexibles. Le point de vue de Java est que vous ne devriez jamais avoir de classes amies afin que ces classes ne soient pas fournies, mais en tant que programmeurs C++, il est de notre responsabilité en tant que communauté de définir l'utilisation appropriée de ces constructions de langage très flexibles mais parfois mal utilisées.
Modifier pour répondre à Tom : Mutable ne casse pas nécessairement l'encapsulation, mais beaucoup d'utilisations du mot-clé mutable que j'ai vues dans des situations réelles cassent l'encapsulation, parce qu'il est beaucoup plus courant de voir des gens casser l'encapsulation avec mutable que de trouver et comprendre une utilisation correcte de mutable en premier lieu.