Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-is-ab:laboratoare:05 [2025/09/23 20:00]
razvan.cristea0106
poo-is-ab:laboratoare:05 [2025/10/11 20:12] (current)
razvan.cristea0106 [Supraîncărcarea operatorilor]
Line 15: Line 15:
 ==== Introducere ==== ==== Introducere ====
  
-În acest laborator, ne vom concentra pe aprofundarea conceptului de **overloading (supraîncărcare)**,​ un aspect esențial al **POO**. Așa cum am introdus deja în [[poo-is-ab:​laboratoare:​02|laboratorul ​2]], atunci când am discutat despre **polimorfism**,​ am înțeles că supraîncărcarea se referă la posibilitatea de a defini mai multe funcții cu același nume, dar cu semnături diferite. Acest mecanism se aplică atât funcțiilor libere, cât și metodelor în cadrul unei clase.+În acest laborator, ne vom concentra pe aprofundarea conceptului de **overloading (supraîncărcare)**,​ un aspect esențial al **POO**. Așa cum am introdus deja în [[poo-is-ab:​laboratoare:​03|laboratorul ​3]], atunci când am discutat despre **polimorfism**,​ am înțeles că supraîncărcarea se referă la posibilitatea de a defini mai multe funcții cu același nume, dar cu semnături diferite. Acest mecanism se aplică atât funcțiilor libere, cât și metodelor în cadrul unei clase.
  
 Este important de subliniat că supraîncărcarea nu schimbă comportamentul fundamental al unei **funcții** sau **metode**, ci oferă alternative prin care acestea pot fi apelate, în funcție de tipul și numărul parametrilor. Cu alte cuvinte, **funcția** sau **metoda** își păstrează scopul de bază, dar poate trata diverse scenarii sau tipuri de date fără a necesita **nume diferite**. Această flexibilitate contribuie la creșterea lizibilității codului și la reducerea redundanței,​ permițând programatorilor să scrie cod mai clar și mai modular. Este important de subliniat că supraîncărcarea nu schimbă comportamentul fundamental al unei **funcții** sau **metode**, ci oferă alternative prin care acestea pot fi apelate, în funcție de tipul și numărul parametrilor. Cu alte cuvinte, **funcția** sau **metoda** își păstrează scopul de bază, dar poate trata diverse scenarii sau tipuri de date fără a necesita **nume diferite**. Această flexibilitate contribuie la creșterea lizibilității codului și la reducerea redundanței,​ permițând programatorilor să scrie cod mai clar și mai modular.
Line 112: Line 112:
  Persoana persoana(22,​ "​Andrei"​);​  Persoana persoana(22,​ "​Andrei"​);​
  
- afisarePersoana(persoana);​+ afisarePersoana(persoana); ​// apelarea functiei friend este identica cu a unei functii clasice din C/C++
  
  return 0;  return 0;
Line 120: Line 120:
 În mod evident puteam declara și implementa o metodă simplă de afișare în loc să optăm pentru o funcție **friend**. Trebuie însă menționat faptul că este doar un exemplu didactic pentru a putea înțelege cum putem folosi funcțiile **friend** în limbajul C++. În mod evident puteam declara și implementa o metodă simplă de afișare în loc să optăm pentru o funcție **friend**. Trebuie însă menționat faptul că este doar un exemplu didactic pentru a putea înțelege cum putem folosi funcțiile **friend** în limbajul C++.
  
-<note warning>​Deși sunt declarate în interiorul clasei **funcțiile friend** se numesc **funcții** și **nu metode** datorită faptului că **nu** primesc **pointerul this** în lista de parametri. Cuvântul cheie **friend** se utilizează **doar** la declararea funcției pentru a înștința compilatorul că este vorba despre o **funcție** și **nu** despre o **metodă**,​ iar implementarea acesteia este **identică** cu a unei **funcții clasice din C++**.</​note>​+<note warning>​Deși sunt declarate în interiorul clasei **funcțiile friend** se numesc **funcții** și **nu metode** datorită faptului că **nu** primesc **pointerul this** în lista de parametri. Cuvântul cheie **friend** se utilizează **doar** la declararea funcției pentru a anunța compilatorul că este vorba despre o **funcție** și **nu** despre o **metodă**,​ iar implementarea acesteia este **identică** cu a unei **funcții clasice din C/C++**.</​note>​
  
 Vom folosi foarte mult acest tip de funcții după cum vom vedea în cele ce urmează la supraîncărcarea operatorilor limbajului C++. Vom folosi foarte mult acest tip de funcții după cum vom vedea în cele ce urmează la supraîncărcarea operatorilor limbajului C++.
Line 245: Line 245:
 </​code>​ </​code>​
  
-<note important>​Se poate observa ​ca la **forma postfixată** avem un parametru de care **nu** ne folosim. Acel parametru este **doar** pentru a asigura **polimorfismul**,​ compilatorul făcând distincția între cele două variante de operator de incrementare.</​note>​+<note important>​Se poate observa ​că la **forma postfixată** avem un parametru de care **nu** ne folosim. Acel parametru este **doar** pentru a asigura **polimorfismul**,​ compilatorul făcând distincția între cele două variante de operator de incrementare.</​note>​
  
 Pentru **operatorul de decrementare** se aplică aceleași **exact** aceeași pași, încercați să îl implementați voi pentru a putea înțelege mai bine cum funcționează conceptul de **overloading**. Pentru **operatorul de decrementare** se aplică aceleași **exact** aceeași pași, încercați să îl implementați voi pentru a putea înțelege mai bine cum funcționează conceptul de **overloading**.
Line 299: Line 299:
 == Supraîncărcarea operatorilor == și != == == Supraîncărcarea operatorilor == și != ==
  
-**Operatorul %%==%%** este folosit pentru a testa egaliatetea ​dintre doi operanzi, deci prin urmare trebuie să returneze o valoare de adevăr (**true** sau **false**). Îl supraîncârcăm ca funcție membră, deoarece avem deja un parametru existent, și anume **pointerul this**, la care mai adăugăm un alt parametru care reprezintă **obiectul cu care facem comparația**.+**Operatorul %%==%%** este folosit pentru a testa egalitatea ​dintre doi operanzi, deci prin urmare trebuie să returneze o valoare de adevăr (**true** sau **false**). Îl supraîncârcăm ca funcție membră, deoarece avem deja un parametru existent, și anume **pointerul this**, la care mai adăugăm un alt parametru care reprezintă **obiectul cu care facem comparația**.
  
 Același lucru putem spune și despre **operatorul %%!=%%**, numai că el face exact **opusul** a ceea ce face operatorul de testare a egalității între doi operanzi, adică verifică dacă valorile celor doi termeni sunt **diferite**. Același lucru putem spune și despre **operatorul %%!=%%**, numai că el face exact **opusul** a ceea ce face operatorul de testare a egalității între doi operanzi, adică verifică dacă valorile celor doi termeni sunt **diferite**.
Line 543: Line 543:
 istream&​ operator>>​(istream&​ in, NrComplex&​ z) istream&​ operator>>​(istream&​ in, NrComplex&​ z)
 { {
- cout << "​Introduceti partea reala a numarului complex: ";+ std::cout << "​Introduceti partea reala a numarului complex: ";
  in >> z.real;  in >> z.real;
  
- cout << "​Introduceti partea imaginara a numarului complex: ";+ std::cout << "​Introduceti partea imaginara a numarului complex: ";
  in >> z.imaginar;  in >> z.imaginar;
  
poo-is-ab/laboratoare/05.1758646835.txt.gz · Last modified: 2025/09/23 20:00 by razvan.cristea0106
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0