O funcție care nu este membru al unei clase poate avea acces la membrii săi privați în cazul în care este declarat prieten al clasei. De exemplu, în exemplul următor, funcția frd () este declarată a fi o altă clasă cl:
linia de clasă;
clasa culorii int culoare; // culoarea dreptunghiului
int upx, upy; // colțul din stânga sus
int lowx, lowy; // colțul din dreapta jos
publice:
prietenul int same_color (linia l, caseta b);
void set_color (int c);
void define_box (int x1, int y1, int x2, int y2);
void show_box ();
>;
clasa culoare int int;
int startx, starty;
int len;
publice:
prietenul int same_color (linia I, caseta b);
void set_color (int c);
void define_line (int x, int y, int I);
void show_line ();
>;
Funcția same_color () nu este membru al niciunei clase, dar este prietenă a celor două. Se întoarce adevărat dacă un obiect de linie și un obiect de casetă sunt desenate cu aceeași culoare și 0 este altfel. Următorul cod definește funcția same_color ():
// returneaza true daca linia si dreptunghiul au aceeasi culoare
int same_color (linia I, caseta b)
dacă (l.color == b.color) întoarce 1;
retur 0;
>
După cum puteți vedea, funcția same_color () trebuie să aibă acces la părțile private ale clasei de linie și ale casetei. Din moment ce este prietena fiecărei clase, ea are dreptul la astfel de acces. Mai mult decât atât, observăm că, deoarece funcția same_color () nu este un membru, nu este necesar să se folosească un operator de domeniu sau să se utilizeze un nume de clasă. Rețineți că, în aceleași scopuri, puteți crea o funcție membru cu specificatorul de acces public, care să returneze culorile obiectelor de tip linie și cutie, precum și o altă funcție de comparare a acestor culori. Cu toate acestea, această abordare ar necesita solicitări de funcții suplimentare, care în unele cazuri sunt ineficiente.
Următorul program demonstrează clasele de linii și casete și arată modul în care o funcție prietenoasă poate accesa membrii claselor private.
#include
#include
linia de clasă;
clasa culorii int culoare; // culoarea dreptunghiului
int upx, upy; // colțul din stânga sus
int lowx, lowy; // colțul din dreapta jos
publice:
prietenul int same_color (linia l, caseta b);
void set_color (int c);
void define_box (int x1, int y1, int x2, int y2);
void show_box ();
>;
clasa culoare int int;
int startx, starty;
int len;
publice:
prietenul int same_color (linia I, caseta b);
void set_color (int c);
void define_line (int x, int y, int I);
void show_line ();
>;
// returneaza true daca linia si dreptunghiul au aceeasi culoare
int same_color (linia I, caseta b)
dacă (l.color == b.color) întoarce 1;
retur 0;
>
caseta void :: set_color (int c)
culoare = c;
>
void line :: set_color (int c)
culoare = c;
>
caseta void :: define_box (int x1, int y1, int x2, int y2)
upx = x1;
upy = y1;
lowx = x2;
lowy = y2;
>
void box :: show_box ()
int i;
textcolor (culoare);
gotoxy (upx, upy);
pentru (i = upx; i<=lowx; i++) cprintf("-");
gotoxy (upx, lowy-1);
pentru (i = upx; i<=lowx; i++) cprintf("-");
gotoxy (upx, upy);
pentru (i = upy; i<=lowy; i++) cprintf (" | ");
gotoxy (upx. i);
>
gotoxy (lowx, upy);
pentru (i = upy; i<=lowy; i++) cprintf ("I");
gotoxy (lowx, i);
>
>
linia void :: define_line (int x, int y, int I)
startx = x;
starty = y;
len = I;
>
void line :: show_line ()
int i;
textcolor (culoare);
gotoxy (startx, starty);
pentru (i = 0; i
int main ()
caseta b;
linia I;
b.define_box (10, 10, 15, 15);
b.set_color (3);
b.show_box ();
l.define_line (2, 2, 10);
l.set_color (2);
l.show_line ();
dacă (! same_color (I, b)) cout <<"Not the same.\n";
cout <<"\nPress a key.";
getch ();
// Faceți acum o linie și un dreptunghi de aceeași culoare
l.define_line (2, 2, 10);
l.set_color (3);
I.show_line ();
dacă (same_color (l, b)) cout <<"Are the same color.\n";
retur 0;
>
Există două limitări importante cu privire la funcțiile prietenoase. Primul este că clasele derivate nu moștenesc funcții prietenoase. Al doilea este că funcțiile prietenoase nu pot fi declarate cu cuvintele cheie statice sau externe.