Documente Academic
Documente Profesional
Documente Cultură
Funciile friend (prieten) sunt funcii asociate unor clase care au acces la datele i metodele protejate ale acelor clase dei nu sunt funcii membre ale acelei clase n Tipuri de funcii prieten
n
funcii
Declararea unei funcii friend se face incluznd prototipul ei, precedat de cuvntul cheie friend, n acea clas
class IdClasa { friend tip_ret id_functie_prieten(lista_de_parametri); };
double distanta(Punct p1, Punct p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y)); } int main(){ Punct p1(1,0), p2(4,4); cout<<"distanta="<< distanta (p1,p2); getch(); }
Definiia funciei distanta. Avem acces asupra datelor private x i y din clasa Punct
Sunt funcii membre ale unei clase ce au acces la datele membru protejate ale unei alte clase. Declararea unei funcii friend se face incluznd prototipul ei, precedat de cuvntul cheie friend, n clasa n care se dorete accesul class IdClasaA; //declarare a clasei IdClasaA naintea definirii clasei IdClasaB class IdClasaB { tip_ret id_functie_prieten(lista_de_parametri); //declararea funciei }; class IdClasaA { friend tip_ret IdClasaB::id_functie_prieten(lista_de_parametri); }; tip_ret IdClasaB::id_functie_prieten(lista_de_parametri) { //corpul de instructiuni n care avem acces la datele protejate ale obiectelor clasei IdClasaA }
Clase si funcii friend. Suprancrcarea operatorilor 6
Dac dorim ca toate metodele dintr-o clas IdClasaB s aibe acces asupra tuturor datelor membre protejate ale unei alte clase IdClasaA atunci declarm clasa IdClasaB ca fiind clas friend (prieten) pentru clasa IdClasaA Sintaxa declarrii claselor prietene este urmtoarea: class IdClasaB; //declarare a clasei IdClasaB inaintea definirii clasei IdClasaA class IdClasaA { friend class IdClasaB; };
Relaia de prietenie dintre dou clase nu este reflexiv: Dac clasa IdClasaA este clas prieten a clasei IdClasaB, atunci nu i reciproca este valabil Relaia de prietenie nu este tranzitiv: dac clasa IdClasaA este clas prieten clasei IdClasaB, iar IdClasaB este clas prieten clasei IdClasaC, asta nu implic faptul c IdClasaA este clas prieten a clasei IdClasaC. Relaia de prietenie nu se motenete n clasele derivate.
Clase si funcii friend. Suprancrcarea operatorilor 9
Suprancrcarea operatorilor
Introducere
n
Un tip de date (predefinit) definete un set de valori i o mulime de operaii ce se pot efectua cu acestea. De exemplu: adunare (+), scadere (-), etc. n Problem: n cazul tipurilor de date definite prin intermediul claselor am putea definii anumite operaii cu ajutorul operatorilor?
Clase si funcii friend. Suprancrcarea operatorilor 12
Suprancrcarea operatorilor
Este procesul de atribuire a dou sau mai multor operaii aceluiai operator. n Se poate realiza prin
n
Funcii
13
15
Alternativa
n
n n
14
Sintaxa
public: Complex (float re = 0, float im = 0); void afisare(); Complex operator +(Complex z); Complex operator~(); friend Complex operator-(Complex z1, Complex z2); friend Complex operator-(Complex z); };
n n
Numrul de parametri este cu 1 mai mic dect aritatea operatorului. Primul operand este obiectul curent pentru care se apeleaz operatorul
Clase si funcii friend. Suprancrcarea operatorilor 17
Complex::Complex (float re, float im){ this->re = re; this->im = im; } void } Complex::afisare(){ printf("%-g%+g*i\n", re, im);
Complex Complex::operator +(Complex z){ Complex rez; rez.re = this->re + z.re; rez.im = this->im + z.im; return rez; } Complex Complex::operator ~(){ return Complex(re,-im); } Complex operator -(Complex z1, Complex z2){ return Complex(z1.re-z2.re,z1.im-z2.im); } Complex operator -(Complex z){ return Complex(-z.re,-z.im); } int main(){ Complex z1(4,5), z2(3,1), z; z=z1 + z2; z=z1 - z2; z=~z1; z=-z1 }
19
Sintaxa class IdClasa { friend tip_rez operator simbol_operator (lista_parametri) ; }; tip_rez operator simbol_operator (lista_parametri) { } Numrul de parametri este egal cu aritatea operatorului. Primul operand este obiectul curent pentru care se apeleaz operatorul
Postincrementare (a++)
n
cu funcie membru
class IdClasa { IdClasa& operator ++ () ; };
cu funcie membru
class IdClasa { IdClasa& operator ++ (int n) ; };
cu funcie prieten
class IdClasa { IdClasa& operator ++ (IdClasa &ob) ; };
cu funcie prieten
class IdClasa { IdClasa& operator ++ (IdClasa &ob, int n) ; };
n n
18
20
Suprancrcarea operatorilor ++ i -class Complex { private: float re; float im; public: Complex (float re=0, float im=0); void afisare(); Complex& operator ++(); Complex& operator ++(int); friend Complex& operator --(Complex& z); friend Complex& operator --(Complex& z,int n); }; Complex& Complex::operator ++(){ re +=1; printf("preincrementare\n"); return *this; } Complex& Complex::operator ++(int n){ re +=1; printf("postincrementare\n"); return *this; } Complex& operator --(Complex& z){ z.re -=1; printf("predecremntare\n"); return z; } Complex& operator --(Complex& z, int n){ z.re -=1; printf("postdecrementare\n"); return z; } int main(){ Complex z(4,5); z.afisare(); ++z; z.afisare(); z++; z.afisare(); --z; z.afisare(); z--; z.afisare(); } 4+5*i preincrementare 5+5*i postincrementare 6+5*i predecremntare 5+5*i postdecrementare 4+5*i
Suprancrcarea operatorului =
n
OUTPUT
Dac o clas nu are suprancrcat operatorul egal atunci compilatorul va genera o suprancarcare standard care va realiza copierea bit cu bit a datelor membru Dac o clas conine date membru obiecte ale altor clase i nu are suprancrcat operatorul =, atunci constructorul generat de compilator va apela la suprancarcarile operatorului = pentru copierea obiectelor membru
21
23
Suprancrcarea operatorului =
n
22
24
25
27
Tem
n
Implementai clasa Polinom pentru care suprancrcai operatori +, * pentru a efectua adunarea i nmulirea a doi vectori n Implementai clasa Matrice reprezentat sub forma unui tablou unidimensional alocat dinamic. Suprancrcai operatori + (suma),* (produs).
Clase si funcii friend. Suprancrcarea operatorilor 28
26