This shows you the differences between two versions of the page.
|
poo-is-ab:laboratoare:03 [2025/10/11 16:16] razvan.cristea0106 |
poo-is-ab:laboratoare:03 [2025/12/07 13:14] (current) razvan.cristea0106 [Programarea Orientată pe Obiecte (POO)] |
||
|---|---|---|---|
| Line 191: | Line 191: | ||
| </code> | </code> | ||
| - | <note important>Un obiect nu este altceva decât un reprezentant al clasei, care respectă structura acesteia, adică deține toate proprietățile pe care clasa le pune la dispoziție. Pentru a înțelege puteți face analogia cu oamenii. Toți oamenii au plămâni, aceasta fiind o caracteristică comună speciei umane. Diferențele pot să apară la starea de sănătate a plămânilor, deoarece, în general, persoanele mai tinere au plămâni mai sănătoși comparativ cu cei ai persoanelor vârstnice. Starea de sănătate a plămânilor poate varia și în funcție de factori precum stilul de viață, expunerea la poluare sau fumat.</note> | + | <note important>Un **obiect** nu este altceva decât un **reprezentant** al clasei, care respectă structura acesteia, adică deține **toate proprietățile** pe care clasa le pune la dispoziție. Pentru a înțelege mai bine putem face analogia cu oamenii. Toți oamenii au **plămâni**, aceasta fiind o **caracteristică comună** speciei umane. Diferențele pot să apară la **starea de sănătate** a plămânilor, deoarece, în general, persoanele mai **tinere** au plămâni **mai sănătoși** comparativ cu cei ai persoanelor **vârstnice**. Starea de sănătate a plămânilor poate varia și în funcție de **factori** precum **stilul de viață**, **expunerea la poluare** sau **fumat**.</note> |
| Dacă vom dori să accesăm membrii clasei **Brad** direct din funcția **main** vom primi o eroare de compilare, deoarece membrii sunt **inaccesibili**. | Dacă vom dori să accesăm membrii clasei **Brad** direct din funcția **main** vom primi o eroare de compilare, deoarece membrii sunt **inaccesibili**. | ||
| Line 243: | Line 243: | ||
| </code> | </code> | ||
| - | <note warning>Acest lucru însă **nu** este o variantă indicată, deoarece **am încălcat principiul încapsulării datelor** și în plus, acum oricine poate modifica din exterior membrii clasei. După cum se poate observa, clasa **Brad** scrisă în această manieră se comportă exact ca o structură. Diferența între cele 2 (struct și class) constă în faptul că într-o structură totul este marcat cu **public** by default în timp ce o clasă are membrii by default marcați cu **private**. Vom menționa mai târziu cum putem respecta principiul încaspulării datelor pentru clasa **Brad** când vom discuta despre funcții membre (metode).</note> | + | <note warning>Acest lucru însă **nu** este o variantă indicată, deoarece **am încălcat principiul încapsulării datelor** și în plus, acum oricine poate modifica din exterior membrii clasei. După cum se poate observa, clasa **Brad** scrisă în această manieră se comportă exact ca o **structură**. Diferența între cele 2 (**struct** și **class**) constă în faptul că într-o structură **totul** este marcat cu **public** by default în timp ce o clasă are membrii by default marcați cu **private**. Vom menționa mai târziu cum putem respecta principiul încaspulării datelor pentru clasa **Brad** când vom discuta despre **funcții membre** (**metode**).</note> |
| == Moștenirea == | == Moștenirea == | ||
| Line 249: | Line 249: | ||
| Moștenirea (**Inheritance**) permite unei clase să **preia** proprietățile și comportamentele unei alte clase, oferind astfel posibilitatea reutilizării codului. În același timp, **clasa derivată (clasa moștenitoare)** poate adăuga funcționalități specifice pe care clasa de bază nu le are, extinzând astfel comportamentul acesteia și adaptându-l la nevoile proprii. | Moștenirea (**Inheritance**) permite unei clase să **preia** proprietățile și comportamentele unei alte clase, oferind astfel posibilitatea reutilizării codului. În același timp, **clasa derivată (clasa moștenitoare)** poate adăuga funcționalități specifice pe care clasa de bază nu le are, extinzând astfel comportamentul acesteia și adaptându-l la nevoile proprii. | ||
| - | <note>Ca și exemplu putem lua omul care este un mamifer. Omul la fel ca toate mamiferele are plămâni, dar spre deosebire de alte animale din categoria mamiferelor acesta are o postură bipedă. Vom detalia mai multe despre moștenire peste câteva laboratoare și tot atunci vom vorbi mai mult despre specificatorul de acces **protected**.</note> | + | <note>Ca și exemplu putem lua ***omul** care este un **mamifer**. Omul la fel ca toate mamiferele are **plămâni**, dar spre deosebire de alte animale din categoria mamiferelor acesta are o **postură bipedă**. Vom detalia mai multe despre **moștenire** peste câteva laboratoare și tot atunci vom vorbi mai mult despre specificatorul de acces **protected**.</note> |
| == Polimorfismul == | == Polimorfismul == | ||
| Line 310: | Line 310: | ||
| == Constructorii == | == Constructorii == | ||
| - | Așa cum le spune și numele această categorie de metode se ocupă de **construirea (inițializarea) obiectelor**. | + | Așa cum le spune și numele această categorie de metode se ocupă de **construirea (inițializarea) obiectelor (instanțelor clasei)**. |
| Constructorii au o serie de trăsături care îi fac pe aceștia foarte ușor de recunoscut după cum urmează: | Constructorii au o serie de trăsături care îi fac pe aceștia foarte ușor de recunoscut după cum urmează: | ||
| Line 399: | Line 399: | ||
| Brad(const float& inaltime); // constructor cu un parametru | Brad(const float& inaltime); // constructor cu un parametru | ||
| - | Brad(const int& vechime, const float& inaltime, const double& pret); | + | Brad(const int& vechime, const float& inaltime, const double& pret); // constructor cu trei parametri |
| }; | }; | ||
| Line 433: | Line 433: | ||
| Pentru a putea soluționa problema de mai sus trebuie să introducem un nou keyword specific **POO** pe care îl vom întâlni în aproape toate limbajele de programare care suportă paradigma **OO** și anume cuvântul cheie **this**. | Pentru a putea soluționa problema de mai sus trebuie să introducem un nou keyword specific **POO** pe care îl vom întâlni în aproape toate limbajele de programare care suportă paradigma **OO** și anume cuvântul cheie **this**. | ||
| - | În C++ **this** este un **pointer** pe care **toate funcțiile membre** îl primesc ca parametru pe **prima poziție**. În C++ acest pointer **nu** este vizibil, **dar asta nu înseamnă că nu există**, în lista de parametri a metodei, dar în limbajul Python acesta este prezent și poartă denumirea de **self** și obligatoriu trebuie pus de către **programator** pe **prima poziție** în lista de parametri a fiecărei **funcții membre** dintr-o clasă. | + | În C++ **this** este un **pointer** pe care **toate funcțiile membre** îl primesc ca parametru pe **prima poziție**. Deși poate părea neclar în C++ acest pointer **nu** este vizibil, **dar asta nu înseamnă că nu există**, în lista de parametri a metodei, dar în limbajul Python acesta este prezent și poartă denumirea de **self** și obligatoriu trebuie pus de către **programator** pe **prima poziție** în lista de parametri a fiecărei **funcții membre** dintr-o clasă. |
| Pointerul **this** indică **adresa obiectului curent** și are rolul de a **rezolva** problemele de ambiguitate între **membrii clasei** și **parametrii metodelor**. Acesta este utilizat pentru a **diferenția** în mod clar variabilele locale de câmpurile obiectului, permițând atribuirea **corectă** a valorilor parametrilor metodelor **membrilor interni** ai obiectului. | Pointerul **this** indică **adresa obiectului curent** și are rolul de a **rezolva** problemele de ambiguitate între **membrii clasei** și **parametrii metodelor**. Acesta este utilizat pentru a **diferenția** în mod clar variabilele locale de câmpurile obiectului, permițând atribuirea **corectă** a valorilor parametrilor metodelor **membrilor interni** ai obiectului. | ||
| Line 440: | Line 440: | ||
| <code cpp> | <code cpp> | ||
| - | // Brad::Brad(Brad* this, const float& inaltime) -> asa arata de fapt aceasta functie la compilare | + | // Brad::Brad(Brad* this, const float& inaltime) -> asa arata de fapt aceasta metoda (functie membra) la compilare |
| Brad::Brad(const float& inaltime) | Brad::Brad(const float& inaltime) | ||
| { | { | ||
| Line 471: | Line 471: | ||
| }; | }; | ||
| - | // Brad::Brad(Brad* this) - asa arata la compilare | + | // Brad::Brad(Brad* this) -> asa arata la compilare |
| Brad::Brad() | Brad::Brad() | ||
| { | { | ||
| Line 479: | Line 479: | ||
| } | } | ||
| - | // Brad::Brad(Brad* this, const float& inaltime) - asa arata la compilare | + | // Brad::Brad(Brad* this, const float& inaltime) -> asa arata la compilare |
| Brad::Brad(const float& inaltime) | Brad::Brad(const float& inaltime) | ||
| { | { | ||
| Line 487: | Line 487: | ||
| } | } | ||
| - | // Brad::Brad(Brad* this, const int& vechime, const float& inaltime, const double& pret) - asa arata la compilare | + | // Brad::Brad(Brad* this, const int& vechime, const float& inaltime, const double& pret) -> asa arata la compilare |
| Brad::Brad(const int& vechime, const float& inaltime, const double& pret) | Brad::Brad(const int& vechime, const float& inaltime, const double& pret) | ||
| { | { | ||
| Line 525: | Line 525: | ||
| Brad(const int& vechime, const float& inaltime, const double& pret); | Brad(const int& vechime, const float& inaltime, const double& pret); | ||
| - | int getVechime() const; // metoda la compilare arata asa: int getVechime(const Brad* this); | + | int getVechime() const; // metoda la compilare arata asa -> int getVechime(const Brad* this); |
| float getInaltime() const; | float getInaltime() const; | ||
| double getPret() const; | double getPret() const; | ||
| - | void setVechime(const int& vechime); // metoda la compilare arata asa: void setVechime(Brad* this, const int& vechime); | + | void setVechime(const int& vechime); // metoda la compilare arata asa -> void setVechime(Brad* this, const int& vechime); |
| void setInaltime(const float& inaltime); | void setInaltime(const float& inaltime); | ||
| void setPret(const double& pret); | void setPret(const double& pret); | ||