Differences

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

Link to this comparison view

poo-is-ab:laboratoare:05 [2025/10/25 17:08]
razvan.cristea0106 [Supraîncărcarea operatorilor]
poo-is-ab:laboratoare:05 [2025/11/01 11:58] (current)
razvan.cristea0106 [Supraîncărcarea operatorilor]
Line 50: Line 50:
 | **Virgulă** ​           | ,                               ​| ​        ​stânga - dreapta ​        | | **Virgulă** ​           | ,                               ​| ​        ​stânga - dreapta ​        |
  
-<note important>​Pentru operatorii din tabelul de mai sus am ales această ordine pentru a putea stabili cu ușurință **prioritățile** fiecăruia dintre ei. Astfel cea mai **mică** prioritate o are operatorul ​**virgulă**,​ în timp ce cea mai **mare** prioritate o au **operatorii primari**.</​note>​+<note important>​Pentru operatorii din tabelul de mai sus am ales această ordine pentru a putea stabili cu ușurință **prioritățile** fiecăruia dintre ei. Astfel cea mai **mică** prioritate o are **operatorul ​virgulă**, în timp ce cea mai **mare** prioritate o au **operatorii primari**.</​note>​
  
 ==== Funcții friend ==== ==== Funcții friend ====
Line 56: Line 56:
 În C++ funcțiile **friend** sunt acele funcții care au aces la zona **privată** a clasei, dar și la cea **protected**. Deși o funcție friend strică **principiul încapsulării datelor**, trebuie menționat că acest lucru este controlat. ​ În C++ funcțiile **friend** sunt acele funcții care au aces la zona **privată** a clasei, dar și la cea **protected**. Deși o funcție friend strică **principiul încapsulării datelor**, trebuie menționat că acest lucru este controlat. ​
  
-<note tip>​Pentru a înțelege mai bine rolul funcțiilor ​**friend**, ​imaginați-vă următoarea analogie: fiecare dintre ​voi are un set de gânduri și sentimente care sunt **private**,​ **inaccesibile** celorlalți. Totuși, ca ființe sociale, avem prieteni cărora alegem să le împărtășim aceste gânduri. Deși prietenii noștri **au acces** la informații personale, acest lucru **nu** înseamnă că oricine poate avea acces la eleVoi sunteți ​cei care **dețineți ​controlul total** asupra a ceea ce **dezvăluiți** și **cui**.</​note>​+<note tip>​Pentru a înțelege mai bine rolul **funcțiilor friend**, ​putem privi lucrurile astfel: fiecare dintre ​noi are un set de gânduri și sentimente care sunt **private**,​ **inaccesibile** celorlalți. Totuși, ca ființe sociale, avem prieteni cărora alegem să le împărtășim ​o parte din aceste gânduri. Deși prietenii noștri **au acces** la informații personale, acest lucru **nu** înseamnă că oricine ​le poate vedea**Noi** suntem ​cei care **deținem controlul total** asupra a ceea ce **dezvăluim** și mai ales **cui**.</​note>​
  
 Pentru a declara o funcție de tip **friend**, folosim cuvântul cheie **friend**. Aceste funcții sunt declarate în interiorul clasei și au cuvântul cheie **friend** plasat **înaintea tipului de return** al funcției. Pentru a declara o funcție de tip **friend**, folosim cuvântul cheie **friend**. Aceste funcții sunt declarate în interiorul clasei și au cuvântul cheie **friend** plasat **înaintea tipului de return** al funcției.
Line 346: Line 346:
 { {
     return this->​real != z.real || this->​imaginar != z.imaginar;     return this->​real != z.real || this->​imaginar != z.imaginar;
 +    /*return !(*this == z) // o varianta mai eleganta de a nega rezultatul intors de operatorul == pentru a nu duplica codul*/
 } }
 </​code>​ </​code>​
Line 401: Line 402:
 ==== ==== ==== ====
  
-<note important>​Nu doar **operatorii unari** sunt supraîncărcați ca funcții membre, mai putem supraîncărca și operatori precum cel de **indexare ("​[]"​)**,​ operatorul de **apel de funcție ("​()"​)**,​ operatorul **săgeată ("​%%->​%%"​)** și operatorul de **asignare ("​="​)**. Cei din urmă trebuie implementați **exclusiv** ca funcții membre în clasă. De asemenea, și operatorii de comparație pot fi supraîncărcați ca **metode** ale clasei, dar în contextul numerelor complexe aceștia **nu au sens**, deoarece în matematică **nu** există **relație de ordine** în mulțimea numerelor complexe.</​note>​+<note important>​Nu doar **operatorii unari** sunt supraîncărcați ca funcții membre, mai putem supraîncărca și operatori precum cel de **indexare ("[ ]")**, operatorul de **apel de funcție ("( )")**, operatorul **săgeată ("​%%->​%%"​)** și operatorul de **asignare ("​="​)**. Cei din urmă trebuie implementați **exclusiv** ca funcții membre în clasă. De asemenea, și operatorii de comparație pot fi supraîncărcați ca **metode** ale clasei, dar în contextul numerelor complexe aceștia **nu au sens**, deoarece în matematică **nu** există **relație de ordine** în mulțimea numerelor complexe.</​note>​
  
 === Operatori supraîncărcați ca funcții friend === === Operatori supraîncărcați ca funcții friend ===
Line 540: Line 541:
  
 <code cpp> <code cpp>
-istream&​ operator>>​(istream&​ in, NrComplex&​ z)+std::istream&​ operator>>​(std::istream&​ in, NrComplex&​ z)
 { {
     std::cout << "​Introduceti partea reala a numarului complex: ";     std::cout << "​Introduceti partea reala a numarului complex: ";
Line 551: Line 552:
 } }
  
-ostream&​ operator<<​(ostream&​ out, const NrComplex&​ z)+std::ostream&​ operator<<​(std::ostream&​ out, const NrComplex&​ z)
 { {
     out << "​Partea reala a numarului complex este: " << z.real << '​\n';​     out << "​Partea reala a numarului complex este: " << z.real << '​\n';​
poo-is-ab/laboratoare/05.1761401320.txt.gz · Last modified: 2025/10/25 17:08 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