Un exemple bien connu : tu fais une classe "Fraction"
Tu veux faire un opérateur qui la multiplie par un double.
Si tu fais :
Fraction Fraction::operator*(double coeff);
donc completement dans la classe, alors tu peux faire :
Fraction c;
Fraction a = c*0.125;
ce qui est équivalent a :
Fraction a = c.operator*(0.125);
Maintenant, imaginons que tu veuilles faire :
Fraction a = 0.125*c;
--> tu ne peux pas t´en sortir sans "friend"
car tu aurais besoin typiquement d´un opérateur :
Fraction double::operator*(Fraction f);
qui n´existe pas, et ne peut pas exister
donc tu fais des fonctions amies :
Fraction operator*(Fraction f,double a)
et
Fraction operator*(double a,Fraction f)
qui te permettront de t´en sortir.
Su tu veux pouvoir malgré tout, dans ces fonctions, accéder aux données privées de f, tu es obligé de la déclarer en friend dans Fraction.