O funcie este prieten (friend) cu o clas dac are acces la datele membru private ale acelei clase. O funcie prieten poate fi o funcie global sau chiar o funcie membru a altei clase. O clas este prieten cu o alt clas dac are acces la datele membru ale acesteia. O funcie, respectiv o clas prieten se declar utiliznd cuvntul friend astfel: 1. friend tip_funcie nume_funcie (Lista_parametri_formali); // funcie friend global 2. friend tip_funcie nume_clas :: nume_functie (Lista_parametrii_formali); // funcie friend membru 3. friend nume_clasa;
Exemplu 1. #include <iostream> #include <conio.h>
using namespace std;
class A { public: // se declara clasa B ca fiind clasa prietena a clasei A friend class B; // declararea functiei g_print_m ca si functie prietena cu clasa A friend void g_afiseaza_m(); private: int m; };
class B { public: void afiseaza_m() { A a; a.m = 255; cout << "clasa B este prietena cu clasa A" << endl << " poate accesa membrul privat A::m" << endl << a.m << endl; } };
void g_afiseaza_m() { A a; a.m = 300; cout << "functia g_afiseaza_m nu este un membru a clasei A dar este prieten" << endl << "poate accesa membrul privat A::m " << endl << a.m << endl; }
int main() { B b; b.afiseaza_m(); g_afiseaza_m(); getch(); return 0; }
Exemplu 2. #include<iostream> #include<conio.h>
using namespace std;
class nod{ int info; nod* urm; public: void adaugare(nod*&, int); void listare(nod*); friend void sterg(nod*, int); };
Inserarea ordonata a unui nod ntr-o lista if(prim==NULL) return p; /*inserarea primului nod*/ else if(strcmp(prim->nume,p->nume)>0) { p->urm=prim;/* inserare inainte de primul nod*/ return p; } else { q=prim; while(q->urm!=NULL && strcmp(q->urm->nume,p->nume)<0) q=q->urm; p->urm=q->urm;/*inserare pe parcurs sau la sfarsit*/ q->urm=p; return prim; }
Stergerea unui nod din lista nod* stergere(nod *prim,char *nume){ nod *q,*p; if(prim!=NULL) /*daca lista nu este vida*/ { if(strcmp(prim->nume,nume)==0) { q=prim; prim=prim->urm; /*stergerea primului nod*/ delete q; return prim; } q=prim; while(q->urm!=NULL && strcmp(q->urm->nume,nume)!=0) q=q->urm; if(q->urm!=NULL && strcmp(q->urm->nume,nume)==0) { p=q->urm; q->urm=q->urm->urm;/*stergerea unui nod din interiorul listei sau de la sfarsit*/ delete p; } return prim; } else { printf(\nLista vida!); return prim; } }