Funcții friend

Funcțiile friend (prieten) sunt funcţii asociate unor clase care au acces la datele şi metodele protejate ale acelor clase deşi nu sunt funcţii membre ale claselor respective. Funcțiile prieten pot fi funcții globale sau funcții membre ale altor clase.

Accesul la datele protejate ale unei clase se poate face, în mod normal, prin funcții membru. Acest lucru îngreunează, însă, accesul, în anumite situații. Soluția de compromis pentru a permite unor funcții nemembru accesul la datele sensibile, este declararea lor ca funcții friend.

Funcţiile operatori pot fi, în egală măsură, funcţii membre sau funcţii nemembre. De regulă, funcţiile nemembre care implementează operatori sunt declarate friend. Chiar dacă un operator este implementat ca funcţie membră sau nu, el este folosit în acelaşi fel în expresii. Atunci când un operator este implementat ca funcţie membră, operandul din stânga operaţiei, sau unicul operand atunci când operaţia este unară, trebuie să fie obiectul clasei sau o referinţă la un obiect al clasei din care face parte operatorul. Dacă operandul din partea stângă a operaţiei trebuie să fie un obiect al altei clase sau dintr-un tip predefinit, atunci operatorul trebuie implementat ca funcţie nemembră a clasei. Acesta este exemplul operatorilor ‘<<’ şi ’>>’ care au în stânga operaţiei streamuri de ieşire sau de intrare. Operatorul ‘<<’ trebuie să aibă un operand stâng de tip ostream&, de exemplu cout din expresia cout << obiect, de aceea trebuie declarat ca funcţie nemembră. În mod similar, operatorul ‘>>’ are un operand stâng de tip istream&, de exemplu cin din expresia cin >> obiect, astfel că şi el trebuie supraîncărcat ca funcţie nemembră.