Dans certains cas, les règles de contrôle d'accès ne sont pas suffisantes : on peut vouloir que certaines fonctions aient accès à tous les membres de la classe sans pour autant être membres de la classe, de même certaines classe peuvent être des auxiliaires d'une autre classe et devraient avoir accès à tous les membres de cette autre classe. Ce sont les amis (friend):
class chaine{ friend chaine operator+(const chaine&,const chaine&); // operateur de concatenation char *buf; int lg; // long de la chaine // ... public: chaine(const char*); chaine(const chaine& ch); // ... }; chaine operator+(const chaine& ch1, const chaine& ch2){ // concatenation, doit voir l'accès à ch1.buf et ch2.buf // ... }On aurait pu définir l'opérateur + comme étant membre de la classe mais, dans ce cas, comme on le verra plus tard, une expression comme
"xyz"+a
*, si a est un objet de la classe chaine.class A{ friend class iter_A; char *ch; //... }; class iter_A{ char *pc; public: iter_A(A){ pc=A.ch;} char operator++(){ if (*pc) pc++; return *pc } }; //... void main(){ // ... class A x; iter_A i=x; char c; while(c=i++)cout<<c; // ... }