This shows you the differences between two versions of the page.
|
poo-is-ab:laboratoare:03 [2025/09/23 19:58] razvan.cristea0106 |
poo-is-ab:laboratoare:03 [2025/12/07 13:14] (current) razvan.cristea0106 [Programarea Orientată pe Obiecte (POO)] |
||
|---|---|---|---|
| Line 29: | Line 29: | ||
| struct Avion | struct Avion | ||
| - | { | + | { |
| - | int numarLocuri; | + | int numarLocuri; |
| - | int anFabricatie; | + | int anFabricatie; |
| - | float capacitateRezervor; | + | float capacitateRezervor; |
| }; | }; | ||
| void afisareAvion(const Avion& avion) | void afisareAvion(const Avion& avion) | ||
| { | { | ||
| - | std::cout << "Numarul de locuri din avion este: " << avion.numarLocuri << '\n'; | + | std::cout << "Numarul de locuri din avion este: " << avion.numarLocuri << '\n'; |
| - | std::cout << "Anul de fabricatie al avionului este: " << avion.anFabricatie << '\n'; | + | std::cout << "Anul de fabricatie al avionului este: " << avion.anFabricatie << '\n'; |
| - | std::cout << "Capacitatea rezervorului avionului este: " << avion.capacitateRezervor << " litri\n"; | + | std::cout << "Capacitatea rezervorului avionului este: " << avion.capacitateRezervor << " litri\n"; |
| } | } | ||
| int main() | int main() | ||
| { | { | ||
| - | Avion avion; // in limbajul C era eroare de compilare daca nu foloseam typedef la definirea structurii | + | Avion avion; // in limbajul C era eroare de compilare daca nu foloseam typedef la definirea structurii |
| - | /* struct Avion avion; // ar fi fost declaratia corecta pentru o variabila de tip Avion in C */ | + | /* struct Avion avion; // ar fi fost declaratia corecta pentru o variabila de tip Avion in C */ |
| - | avion.numarLocuri = 230; | + | avion.numarLocuri = 230; |
| - | avion.anFabricatie = 2000; | + | avion.anFabricatie = 2000; |
| - | avion.capacitateRezervor = 755.5f; | + | avion.capacitateRezervor = 755.5f; |
| - | afisareAvion(avion); | + | afisareAvion(avion); |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| Line 70: | Line 70: | ||
| struct Avion | struct Avion | ||
| { | { | ||
| - | int numarLocuri; | + | int numarLocuri; |
| - | int anFabricatie; | + | int anFabricatie; |
| - | float capacitateRezervor; | + | float capacitateRezervor; |
| }; | }; | ||
| void afisareAvion(const Avion* const avion) | void afisareAvion(const Avion* const avion) | ||
| { | { | ||
| - | printf("Numarul de locuri din avion este: %d\n", avion->numarLocuri); | + | printf("Numarul de locuri din avion este: %d\n", avion->numarLocuri); |
| - | printf("Anul de fabricatie al avionului este: %d\n", avion->anFabricatie); | + | printf("Anul de fabricatie al avionului este: %d\n", avion->anFabricatie); |
| - | printf("Capacitatea rezervorului avionului este: %.2f litri\n", avion->capacitateRezervor); | + | printf("Capacitatea rezervorului avionului este: %.2f litri\n", avion->capacitateRezervor); |
| } | } | ||
| int main() | int main() | ||
| { | { | ||
| - | Avion avion; | + | Avion avion; |
| - | avion.numarLocuri = 230; | + | avion.numarLocuri = 230; |
| - | avion.anFabricatie = 2000; | + | avion.anFabricatie = 2000; |
| - | avion.capacitateRezervor = 755.5f; | + | avion.capacitateRezervor = 755.5f; |
| - | afisareAvion(&avion); | + | afisareAvion(&avion); |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| Line 126: | Line 126: | ||
| class Brad | class Brad | ||
| { | { | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| }; | }; | ||
| </code> | </code> | ||
| Line 163: | Line 163: | ||
| private: // specificatorul de acces private, nu era necesar sa il punem deoarece membrii deja erau privati | private: // specificatorul de acces private, nu era necesar sa il punem deoarece membrii deja erau privati | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| }; | }; | ||
| </code> | </code> | ||
| Line 178: | Line 178: | ||
| private: | private: | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| }; | }; | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; // obiect de tipul clasei Brad (instanta a clasei Brad) | + | Brad brad; // obiect de tipul clasei Brad (instanta a clasei Brad) |
| - | return 0; | + | return 0; |
| } | } | ||
| </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 200: | Line 200: | ||
| class Brad | class Brad | ||
| { | { | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| }; | }; | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; | + | Brad brad; |
| - | brad.vechime = 2; // eroare de compilare, membrul vechime este privat | + | brad.vechime = 2; // eroare de compilare, membrul vechime este privat |
| - | brad.inaltime = 5.25f; // gresit, membrul inaltime este inaccesibil | + | brad.inaltime = 5.25f; // gresit, membrul inaltime este inaccesibil |
| - | brad.pret = 299.99; // membrul pret este marcat ca private | + | brad.pret = 299.99; // membrul pret este marcat ca private |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| Line 226: | Line 226: | ||
| public: // in acest moment cei 3 membri ai clasei sunt vizibili in exteriorul acesteia | public: // in acest moment cei 3 membri ai clasei sunt vizibili in exteriorul acesteia | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| }; | }; | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; | + | Brad brad; |
| - | brad.vechime = 2; | + | brad.vechime = 2; |
| - | brad.inaltime = 5.25f; | + | brad.inaltime = 5.25f; |
| - | brad.pret = 299.99; | + | brad.pret = 299.99; |
| - | return 0; | + | return 0; |
| } | } | ||
| </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 264: | Line 264: | ||
| void interschimbare(int* a, int* b) | void interschimbare(int* a, int* b) | ||
| { | { | ||
| - | if (a == nullptr || b == nullptr) | + | if (a == nullptr || b == nullptr) |
| - | { | + | { |
| - | return; | + | return; |
| - | } | + | } |
| - | int auxiliar = *a; | + | int auxiliar = *a; |
| - | *a = *b; | + | *a = *b; |
| - | *b = auxiliar; | + | *b = auxiliar; |
| } | } | ||
| void interschimbare(int& a, int& b) | void interschimbare(int& a, int& b) | ||
| { | { | ||
| - | int auxiliar = a; | + | int auxiliar = a; |
| - | a = b; | + | a = b; |
| - | b = auxiliar; | + | b = auxiliar; |
| } | } | ||
| int main() | int main() | ||
| { | { | ||
| - | int x = 22; | + | int x = 22; |
| - | int y = 8; | + | int y = 8; |
| - | interschimbare(&x, &y); | + | interschimbare(&x, &y); |
| - | std::cout << "Valoarea lui x este: " << x << '\n'; | + | std::cout << "Valoarea lui x este: " << x << '\n'; |
| - | std::cout << "Valoarea lui y este: " << y << '\n'; | + | std::cout << "Valoarea lui y este: " << y << '\n'; |
| - | interschimbare(x, y); | + | interschimbare(x, y); |
| - | std::cout << "Valoarea lui x este: " << x << '\n'; | + | std::cout << "Valoarea lui x este: " << x << '\n'; |
| - | std::cout << "Valoarea lui y este: " << y << '\n'; | + | std::cout << "Valoarea lui y este: " << y << '\n'; |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| 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 325: | Line 325: | ||
| class Brad | class Brad | ||
| { | { | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| public: | public: | ||
| - | Brad() | + | Brad() |
| - | { | + | { |
| - | vechime = 0; | + | vechime = 0; |
| - | inaltime = 0.0f; | + | inaltime = 0.0f; |
| - | pret = 0.0; | + | pret = 0.0; |
| - | } | + | } |
| }; | }; | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; // echivalent cu a scrie direct Brad brad = Brad(); | + | Brad brad; // echivalent cu a scrie direct Brad brad = Brad(); |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| Line 356: | Line 356: | ||
| class Brad // declaratia clasei se va scrie intr-un fisier cu extensia .h | class Brad // declaratia clasei se va scrie intr-un fisier cu extensia .h | ||
| { | { | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| public: | public: | ||
| - | Brad(); | + | Brad(); |
| }; | }; | ||
| Brad::Brad() // aceasta bucata de cod va exista intr-un fisier cu extensia .cpp | Brad::Brad() // aceasta bucata de cod va exista intr-un fisier cu extensia .cpp | ||
| { | { | ||
| - | vechime = 0; | + | vechime = 0; |
| - | inaltime = 0.0f; | + | inaltime = 0.0f; |
| - | pret = 0.0; | + | pret = 0.0; |
| } | } | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; // echivalent cu a scrie direct Brad brad = Brad(); | + | Brad brad; // echivalent cu a scrie direct Brad brad = Brad(); |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| Line 389: | Line 389: | ||
| class Brad | class Brad | ||
| { | { | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| public: | public: | ||
| - | // Brad(); | + | // Brad(); |
| - | 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 |
| }; | }; | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; // eroare de compilare, nu exista constructor default | + | Brad brad; // eroare de compilare, nu exista constructor default |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| Line 419: | Line 419: | ||
| Brad::Brad(const float& inaltime) | Brad::Brad(const float& inaltime) | ||
| { | { | ||
| - | vechime = 0; | + | vechime = 0; |
| - | inaltime = inaltime; // eroare de compilare | + | inaltime = inaltime; // eroare de compilare |
| - | pret = 0.0; | + | pret = 0.0; |
| } | } | ||
| </code> | </code> | ||
| 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) | ||
| { | { | ||
| - | vechime = 0; // nu este nevoie de this deoarece compilatorul stie ca este vorba despre campul vechime al obiectului curent | + | vechime = 0; // nu este nevoie de this deoarece compilatorul stie ca este vorba despre campul vechime al obiectului curent |
| - | this->inaltime = inaltime; | + | this->inaltime = inaltime; |
| - | pret = 0.0; // aceeasi explicatie ca la vechime | + | pret = 0.0; // aceeasi explicatie ca la vechime |
| } | } | ||
| </code> | </code> | ||
| Line 458: | Line 458: | ||
| class Brad | class Brad | ||
| { | { | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| public: | public: | ||
| - | Brad(); // constructor default | + | Brad(); // constructor default |
| - | 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); // constructor cu 3 parametri | + | Brad(const int& vechime, const float& inaltime, const double& pret); // constructor cu 3 parametri |
| }; | }; | ||
| - | // Brad::Brad(Brad* this) - asa arata la compilare | + | // Brad::Brad(Brad* this) -> asa arata la compilare |
| Brad::Brad() | Brad::Brad() | ||
| { | { | ||
| - | vechime = 0; // nu este nevoie de this, dar nu este gresit nici daca scriem this->vechime = 0; | + | vechime = 0; // nu este nevoie de this, dar nu este gresit nici daca scriem this->vechime = 0; |
| - | inaltime = 0.0f; | + | inaltime = 0.0f; |
| - | pret = 0.0; | + | pret = 0.0; |
| } | } | ||
| - | // 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) | ||
| { | { | ||
| - | vechime = 0; | + | vechime = 0; |
| - | this->inaltime = inaltime; | + | this->inaltime = inaltime; |
| - | pret = 0.0; | + | pret = 0.0; |
| } | } | ||
| - | // 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) | ||
| { | { | ||
| - | this->pret = pret; | + | this->pret = pret; |
| - | this->vechime = vechime; | + | this->vechime = vechime; |
| - | this->inaltime = inaltime; | + | this->inaltime = inaltime; |
| } | } | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; // se apeleaza constructorul default | + | Brad brad; // se apeleaza constructorul default |
| - | Brad bradut(4.75f); // se apeleaza constructorul cu un parametru (echivalent cu a scrie Brad bradut = Brad(4.75f);) | + | Brad bradut(4.75f); // se apeleaza constructorul cu un parametru (echivalent cu a scrie Brad bradut = Brad(4.75f);) |
| - | Brad b(2, 2.25f, 399.99); // se apeleaza constructorul cu un parametru (echivalent cu a scrie Brad b = Brad(2, 2.25f, 399.99);) | + | Brad b(2, 2.25f, 399.99); // se apeleaza constructorul cu un parametru (echivalent cu a scrie Brad b = Brad(2, 2.25f, 399.99);) |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||
| Line 516: | Line 516: | ||
| class Brad | class Brad | ||
| { | { | ||
| - | int vechime; | + | int vechime; |
| - | float inaltime; | + | float inaltime; |
| - | double pret; | + | double pret; |
| public: | public: | ||
| - | Brad(); | + | Brad(); |
| - | 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); |
| }; | }; | ||
| </code> | </code> | ||
| Line 540: | Line 540: | ||
| Brad::Brad() | Brad::Brad() | ||
| { | { | ||
| - | vechime = 0; | + | vechime = 0; |
| - | inaltime = 0.0f; | + | inaltime = 0.0f; |
| - | pret = 0.0; | + | pret = 0.0; |
| } | } | ||
| Brad::Brad(const int& vechime, const float& inaltime, const double& pret) | Brad::Brad(const int& vechime, const float& inaltime, const double& pret) | ||
| { | { | ||
| - | this->pret = pret; | + | this->pret = pret; |
| - | this->vechime = vechime; | + | this->vechime = vechime; |
| - | this->inaltime = inaltime; | + | this->inaltime = inaltime; |
| } | } | ||
| int Brad::getVechime() const // acest const este adresat pointerului this (continutul de la adresa spre care pointeaza nu poate fi modificat) | int Brad::getVechime() const // acest const este adresat pointerului this (continutul de la adresa spre care pointeaza nu poate fi modificat) | ||
| { | { | ||
| - | // this->vechime = 5; // imposibil din cauza const-ului din semnatura functiei | + | // this->vechime = 5; // imposibil din cauza const-ului din semnatura functiei |
| - | return vechime; // era corect si daca scriam return this->vechime; | + | return vechime; // era corect si daca scriam return this->vechime; |
| } | } | ||
| float Brad::getInaltime() const | float Brad::getInaltime() const | ||
| { | { | ||
| - | return inaltime; | + | return inaltime; |
| } | } | ||
| void Brad::setVechime(const int& vechime) | void Brad::setVechime(const int& vechime) | ||
| { | { | ||
| - | if (vechime <= 0) // verificam daca valoarea primita ca parametru este una valida | + | if (vechime <= 0) // verificam daca valoarea primita ca parametru este una valida |
| - | { | + | { |
| - | return; | + | return; |
| - | } | + | } |
| - | this->vechime = vechime; // trebuie folosit this deoarece parametrul are acelasi nume ca si campul clasei | + | this->vechime = vechime; // trebuie folosit this deoarece parametrul are acelasi nume ca si campul clasei |
| } | } | ||
| void Brad::setInaltime(const float& inaltime) | void Brad::setInaltime(const float& inaltime) | ||
| { | { | ||
| - | if (inaltime <= 0) | + | if (inaltime <= 0) |
| - | { | + | { |
| - | return; | + | return; |
| - | } | + | } |
| - | this->inaltime = inaltime; | + | this->inaltime = inaltime; |
| } | } | ||
| int main() | int main() | ||
| { | { | ||
| - | Brad brad; // se apeleaza constructorul default | + | Brad brad; // se apeleaza constructorul default |
| - | brad.setVechime(3); | + | brad.setVechime(3); |
| - | brad.setInaltime(5.5f); | + | brad.setInaltime(5.5f); |
| - | std::cout << "Vechimea bradului este: " << brad.getVechime() << " ani\n"; | + | std::cout << "Vechimea bradului este: " << brad.getVechime() << " ani\n"; |
| - | std::cout << "Inaltimea bradului este: " << brad.getInaltime() << " metri\n"; | + | std::cout << "Inaltimea bradului este: " << brad.getInaltime() << " metri\n"; |
| - | return 0; | + | return 0; |
| } | } | ||
| </code> | </code> | ||