Differences

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

Link to this comparison view

poo-is-ab:laboratoare:04 [2025/09/25 10:26]
razvan.cristea0106 [Operatorul de atribuire]
poo-is-ab:laboratoare:04 [2025/10/18 22:44] (current)
razvan.cristea0106
Line 10: Line 10:
   * recunoască și să utilizeze membri constanți, garantând imutabilitatea acestora   * recunoască și să utilizeze membri constanți, garantând imutabilitatea acestora
   * folosească atribute și funcții statice, care aparțin clasei în ansamblu și nu instanțelor individuale   * folosească atribute și funcții statice, care aparțin clasei în ansamblu și nu instanțelor individuale
-  * implementeze destructorul pentru a asigura eliberarea resurselor la distrugerea obiectelor +  * implementeze destructorul pentru a asigura eliberarea ​corectă a resurselor la distrugerea obiectelor 
-  * implementeze constructorul de copiere și operatorul de atribuire, gestionând corect copierea profundă a conținutului obiectelor+  * implementeze constructorul de copiere și operatorul de asignare, gestionând corect copierea profundă a conținutului obiectelor
  
 ==== Introducere ==== ==== Introducere ====
Line 24: Line 24:
 class Conifer class Conifer
 { {
- double pret; +    ​double pret; 
- float inaltime;+    float inaltime;
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime);+    Conifer(const double& pret, const float& inaltime);
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const;+    float getInaltime() const;
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);+    void setInaltime(const float& inaltime);
 }; };
 </​code>​ </​code>​
Line 47: Line 47:
 Conifer::​Conifer() Conifer::​Conifer()
 { {
- pret = 0.0; +    ​pret = 0.0; 
- inaltime = 0.0f;+    inaltime = 0.0f;
 } }
  
 Conifer::​Conifer(const double& pret, const float& inaltime) Conifer::​Conifer(const double& pret, const float& inaltime)
 { {
- this->​pret = pret; +    ​this->​pret = pret; 
- this->​inaltime = inaltime;+    this->​inaltime = inaltime;
 } }
  
 double Conifer::​getPret() const double Conifer::​getPret() const
 { {
- return pret;+    ​return pret;
 } }
  
 float Conifer::​getInaltime() const float Conifer::​getInaltime() const
 { {
- return inaltime;+    ​return inaltime;
 } }
  
 void Conifer::​setPret(const double& pret) void Conifer::​setPret(const double& pret)
 { {
- if (pret <= 0) +    ​if (pret <= 0) 
-+    
- return; +        return; 
- }+    }
  
- this->​pret = pret;+    ​this->​pret = pret;
 } }
  
 void Conifer::​setInaltime(const float& inaltime) void Conifer::​setInaltime(const float& inaltime)
 { {
- if (inaltime <= 0) +    ​if (inaltime <= 0) 
-+    
- return; +        return; 
- }+    }
  
- this->​inaltime = inaltime;+    ​this->​inaltime = inaltime;
 } }
 </​code>​ </​code>​
Line 92: Line 92:
 ==== Membri de tip pointer ==== ==== Membri de tip pointer ====
  
-Să presupunem că suntem ​administratorii ​unui site care aparține unei firme care se ocupă de comercializarea coniferelor. Firma respectivă are mai multe tipuri de conifere care sunt caracterizate prin denumire, spre exemplu: brad, pin, molid, zadă, ienupăr, etc. După cum se poate observa denumirea fiecărui tip de conifer variază. Noi ca și administratori ​ai site-ului ar trebui să concepem un mecanism prin care să putem stoca în baza de date aceste denumiri indiferent de varietatea lor.+Să presupunem că suntem ​dezvoltatorii ​unui site web pentru o firmă ​care se ocupă de comercializarea coniferelor. Firma respectivă are mai multe tipuri de conifere care sunt caracterizate prin denumire, spre exemplu: brad, pin, molid, zadă, ienupăr, etc. După cum se poate observa denumirea fiecărui tip de conifer variază. Noi ca și developeri ​ai site-ului ar trebui să concepem un mecanism prin care să putem stoca în baza de date aceste denumiri indiferent de varietatea lor.
  
 Dacă ne uităm acum mai atent la denumirile enumerate anterior putem observa că din punct de vedere al programării acestea nu sunt altceva decât șiruri de caractere care au lungimi diferite. Pentru a putea accepta orice fel de denumire de conifer în cod ar trebui ca în clasa noastră să avem un membru în care putem stoca șiruri de caractere. Dacă ne uităm acum mai atent la denumirile enumerate anterior putem observa că din punct de vedere al programării acestea nu sunt altceva decât șiruri de caractere care au lungimi diferite. Pentru a putea accepta orice fel de denumire de conifer în cod ar trebui ca în clasa noastră să avem un membru în care putem stoca șiruri de caractere.
Line 103: Line 103:
 class Conifer class Conifer
 { {
- double pret; +    ​double pret; 
- float inaltime; +    float inaltime; 
- char* denumire; // membru de tip pointer la char+    char* denumire; // membru de tip pointer la char
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime, const char* denumire); // se aduga un nou parametru la acest constructor+    Conifer(const double& pret, const float& inaltime, const char* denumire); // se aduga un nou parametru la acest constructor
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const; +    float getInaltime() const; 
- char* getDenumire() const;+    char* getDenumire() const;
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);​ +    void setInaltime(const float& inaltime);​ 
- void setDenumire(const char* denumire);+    void setDenumire(const char* denumire);
 }; };
 </​code>​ </​code>​
Line 135: Line 135:
  
 <code cpp> <code cpp>
-#include <​iostream>​ 
 #include <​cstring>​ #include <​cstring>​
 +#include <​iostream>​
  
 int main() int main()
 { {
- char* sir1 = new char[strlen("​Ionescu"​) + 1]; +    ​char* sir1 = new char[strlen("​Ionescu"​) + 1]; 
- strcpy(sir1,​ "​Ionescu"​);​+    strcpy(sir1,​ "​Ionescu"​);​
  
- char* sir2 = sir1; // shallow copy (sir2 partajeaza aceeasi zona de memorie ca sir1) +    ​char* sir2 = sir1; // shallow copy (sir2 partajeaza aceeasi zona de memorie ca sir1) 
- sir2[0] = '​J';​+    sir2[0] = '​J';​
  
- std::cout << "​Primul sir de caractere are valoarea: " << sir1 << '​\n';​ +    ​std::cout << "​Primul sir de caractere are valoarea: " << sir1 << '​\n';​ 
- std::cout << "Al doilea sir de caractere are valoarea: " << sir2 << '​\n';​+    std::cout << "Al doilea sir de caractere are valoarea: " << sir2 << '​\n';​
  
-        ​delete[] sir1; +    ​delete[] sir1; 
-        /*delete[] sir2; // incorect deoarece deja am eliberat zona de memorie cu o linie mai sus*/+    /*delete[] sir2; // incorect deoarece deja am eliberat zona de memorie cu o linie mai sus*/
  
- return 0;+    ​return 0;
 } }
 </​code>​ </​code>​
Line 171: Line 171:
  
 <code cpp> <code cpp>
-#include <​iostream>​ 
 #include <​cstring>​ #include <​cstring>​
 +#include <​iostream>​
  
 int main() int main()
 { {
- char* sir1 = new char[strlen("​Ionescu"​) + 1]; +    ​char* sir1 = new char[strlen("​Ionescu"​) + 1]; 
- strcpy(sir1,​ "​Ionescu"​);​+    strcpy(sir1,​ "​Ionescu"​);​
  
- char* sir2 = new char[strlen(sir1) + 1]; +    ​char* sir2 = new char[strlen(sir1) + 1]; 
- strcpy(sir2,​ sir1);+    strcpy(sir2,​ sir1);
  
- sir2[0] = '​J';​+    ​sir2[0] = '​J';​
  
- std::cout << "​Primul sir de caractere are valoarea: " << sir1 << '​\n';​ +    ​std::cout << "​Primul sir de caractere are valoarea: " << sir1 << '​\n';​ 
- std::cout << "Al doilea sir de caractere are valoarea: " << sir2 << '​\n';​+    std::cout << "Al doilea sir de caractere are valoarea: " << sir2 << '​\n';​
  
- delete[] sir1; +    ​delete[] sir1; 
- delete[] sir2; // corect deoarece sir1 si sir2 pointeaza catre doua blocuri de memorie diferite+    delete[] sir2; // corect deoarece sir1 si sir2 pointeaza catre doua blocuri de memorie diferite
  
- return 0;+    ​return 0;
 } }
 </​code>​ </​code>​
Line 211: Line 211:
 Conifer::​Conifer() Conifer::​Conifer()
 { {
- pret = 0.0; +    ​pret = 0.0; 
- inaltime = 0.0f; +    inaltime = 0.0f; 
- denumire = nullptr;+    denumire = nullptr;
 } }
  
 Conifer::​Conifer(const double& pret, const float& inaltime, const char* denumire) Conifer::​Conifer(const double& pret, const float& inaltime, const char* denumire)
 { {
- this->​pret = pret; +    ​this->​pret = pret; 
- this->​inaltime = inaltime;+    this->​inaltime = inaltime;
  
- if (denumire != nullptr) +    ​if (denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(denumire) + 1]; +        this->​denumire = new char[strlen(denumire) + 1]; 
- strcpy(this->​denumire,​ denumire);​ +        strcpy(this->​denumire,​ denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
 } }
  
 char* Conifer::​getDenumire() const char* Conifer::​getDenumire() const
 { {
- return denumire;+    ​return denumire;
 } }
  
 void Conifer::​setDenumire(const char* denumire) void Conifer::​setDenumire(const char* denumire)
 { {
- if (denumire == nullptr || strlen(denumire) < 3) +    ​if (denumire == nullptr || strlen(denumire) < 3) 
-+    
- return; +        return; 
- }+    }
  
- if (this->​denumire != nullptr) +    ​if (this->​denumire != nullptr) 
-+    
- delete[] this->​denumire;​ +        delete[] this->​denumire;​ 
- }+    }
  
- this->​denumire = new char[strlen(denumire) + 1]; +    ​this->​denumire = new char[strlen(denumire) + 1]; 
- strcpy(this->​denumire,​ denumire);+    strcpy(this->​denumire,​ denumire);
 } }
 </​code>​ </​code>​
Line 273: Line 273:
 class Conifer class Conifer
 { {
- double pret; +    ​double pret; 
- float inaltime; +    float inaltime; 
- char* denumire;+    char* denumire;
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime, const char* denumire);​ +    Conifer(const double& pret, const float& inaltime, const char* denumire);​ 
- ~Conifer();​ // destructorul clasei Conifer+    ~Conifer(); // destructorul clasei Conifer
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const; +    float getInaltime() const; 
- char* getDenumire() const;+    char* getDenumire() const;
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);​ +    void setInaltime(const float& inaltime);​ 
- void setDenumire(const char* denumire);+    void setDenumire(const char* denumire);
 }; };
 </​code>​ </​code>​
Line 300: Line 300:
 Conifer::​~Conifer() Conifer::​~Conifer()
 { {
- if (denumire != nullptr) +    ​if (denumire != nullptr) 
-+    
- delete[] denumire; +        delete[] denumire; 
- }+    }
 } }
 </​code>​ </​code>​
Line 322: Line 322:
 class Conifer class Conifer
 { {
- double pret; +    ​double pret; 
- float inaltime; +    float inaltime; 
- char* denumire;+    char* denumire;
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime, const char* denumire);​ +    Conifer(const double& pret, const float& inaltime, const char* denumire);​ 
- Conifer(const Conifer&​ conifer); // constructorul de copiere pentru clasa Conifer +    Conifer(const Conifer&​ conifer); // constructorul de copiere pentru clasa Conifer 
- ~Conifer();​+    ~Conifer();
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const; +    float getInaltime() const; 
- char* getDenumire() const;+    char* getDenumire() const;
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);​ +    void setInaltime(const float& inaltime);​ 
- void setDenumire(const char* denumire);+    void setDenumire(const char* denumire);
 }; };
 </​code>​ </​code>​
  
-Iar mai jos am implementat ​acest constructor în așa fel încât să realizeze **deep copy**.+Iar mai jos vom implementa ​acest constructor în așa fel încât să realizeze **deep copy**.
  
 <code cpp> <code cpp>
 Conifer::​Conifer(const Conifer&​ conifer) Conifer::​Conifer(const Conifer&​ conifer)
 { {
- this->​pret = conifer.pret;​ +    ​this->​pret = conifer.pret;​ 
- this->​inaltime = conifer.inaltime;​+    this->​inaltime = conifer.inaltime;​
  
- if (conifer.denumire != nullptr) +    ​if (conifer.denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(conifer.denumire) + 1]; +        this->​denumire = new char[strlen(conifer.denumire) + 1]; 
- strcpy(this->​denumire,​ conifer.denumire);​ +        strcpy(this->​denumire,​ conifer.denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
 } }
 </​code>​ </​code>​
Line 365: Line 365:
 Astfel **constructorul de copiere** este acum specializat pentru crearea de **clone reale** pentru obiectele de tip **Conifer**. Astfel **constructorul de copiere** este acum specializat pentru crearea de **clone reale** pentru obiectele de tip **Conifer**.
  
-==== Operatorul de atribuire ​====+==== Operatorul de asignare ​====
  
-Operatorul de atribuire (**Operatorul =** sau **Operatorul de asignare**) este folosit pentru a copia conținutul unui obiect existent într-un alt **obiect existent**. În esență, operatorul de **atribuire (asignare)** și **constructorul de copiere** au un comportament similar, deoarece ambii sunt responsabili de copierea valorilor dintr-un obiect în altul. Principala diferență între aceste două **funcții membre** constă în **momentul** și **contextul** în care sunt utilizate.+Operatorul de atribuire (**Operatorul =** sau **Operatorul de asignare**) este folosit pentru a copia conținutul unui **obiect existent** într-un alt **obiect existent**. În esență, operatorul de **atribuire (asignare)** și **constructorul de copiere** au un comportament similar, deoarece ambii sunt responsabili de copierea valorilor dintr-un obiect în altul. Principala diferență între aceste două **funcții membre** constă în **momentul** și **contextul** în care sunt utilizate.
  
-**Constructorul de copiere** este folosit atunci când un **nou** obiect este creat pe baza unui alt **obiect existent**. Pe de altă parte, **operatorul de atribuire** este utilizat atunci când un obiect **deja existent** primește valori din alt obiect, adică obiectul în care se copiază conținutul trebuie să aibă deja alocată memorie și să fi fost inițializat anterior.+**Constructorul de copiere** este folosit atunci când un **nou** obiect este **creat** pe baza unui alt **obiect existent**. Pe de altă parte, **operatorul de atribuire** este utilizat atunci când un obiect **deja existent** primește valori din alt obiect, adică obiectul în care se copiază conținutul trebuie să aibă deja alocată memorie și să fi fost inițializat anterior.
  
 <note important>​La fel ca și în cazul **constructorului de copiere**, compilatorul va genera el o variantă de **operator de asignare** dacă programatorul nu îl declară și nu îl implementează. La fel ca în cazul **copy constructor-ului**,​ varianta generată de complilator pentru **operatorul =** face **shallow copy**, deci va trebui să fie implementat de către programator pentru a face **deep copy**.</​note>​ <note important>​La fel ca și în cazul **constructorului de copiere**, compilatorul va genera el o variantă de **operator de asignare** dacă programatorul nu îl declară și nu îl implementează. La fel ca în cazul **copy constructor-ului**,​ varianta generată de complilator pentru **operatorul =** face **shallow copy**, deci va trebui să fie implementat de către programator pentru a face **deep copy**.</​note>​
Line 382: Line 382:
 class Conifer class Conifer
 { {
- double pret; +    ​double pret; 
- float inaltime; +    float inaltime; 
- char* denumire;+    char* denumire;
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime, const char* denumire);​ +    Conifer(const double& pret, const float& inaltime, const char* denumire);​ 
- Conifer(const Conifer&​ conifer); +    Conifer(const Conifer&​ conifer); 
- Conifer&​ operator=(const Conifer&​ conifer); // operatorul de asignare +    Conifer&​ operator=(const Conifer&​ conifer); // operatorul de asignare 
- ~Conifer();​+    ~Conifer();
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const; +    float getInaltime() const; 
- char* getDenumire() const;+    char* getDenumire() const;
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);​ +    void setInaltime(const float& inaltime);​ 
- void setDenumire(const char* denumire);+    void setDenumire(const char* denumire);
 }; };
 </​code>​ </​code>​
Line 409: Line 409:
 Conifer&​ Conifer::​operator=(const Conifer&​ conifer) Conifer&​ Conifer::​operator=(const Conifer&​ conifer)
 { {
- if (this->​denumire != nullptr) +    ​if (this->​denumire != nullptr) 
-+    
- delete[] this->​denumire;​ +        delete[] this->​denumire;​ 
- }+    }
  
- this->​pret = conifer.pret;​ +    ​this->​pret = conifer.pret;​ 
- this->​inaltime = conifer.inaltime;​+    this->​inaltime = conifer.inaltime;​
  
- if (conifer.denumire != nullptr) +    ​if (conifer.denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(conifer.denumire) + 1]; +        this->​denumire = new char[strlen(conifer.denumire) + 1]; 
- strcpy(this->​denumire,​ conifer.denumire);​ +        strcpy(this->​denumire,​ conifer.denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
  
- return *this;+    ​return *this;
 } }
 </​code>​ </​code>​
Line 436: Line 436:
 Conifer&​ Conifer::​operator=(const Conifer&​ conifer) Conifer&​ Conifer::​operator=(const Conifer&​ conifer)
 { {
- if (this == &​conifer) // verificarea de auto-asignare +    ​if (this == &​conifer) // verificarea de auto-asignare 
-+    
- return *this; +        return *this; 
- }+    }
  
- if (this->​denumire != nullptr) +    ​if (this->​denumire != nullptr) 
-+    
- delete[] this->​denumire;​ +        delete[] this->​denumire;​ 
- }+    }
  
- this->​pret = conifer.pret;​ +    ​this->​pret = conifer.pret;​ 
- this->​inaltime = conifer.inaltime;​+    this->​inaltime = conifer.inaltime;​
  
- if (conifer.denumire != nullptr) +    ​if (conifer.denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(conifer.denumire) + 1]; +        this->​denumire = new char[strlen(conifer.denumire) + 1]; 
- strcpy(this->​denumire,​ conifer.denumire);​ +        strcpy(this->​denumire,​ conifer.denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
  
- return *this;+    ​return *this;
 } }
 </​code>​ </​code>​
Line 482: Line 482:
 class Conifer class Conifer
 { {
- double pret; // membru non-static +    ​double pret; // membru non-static 
- float inaltime; // membru non-static +    float inaltime; // membru non-static 
- char* denumire; // membru non-static+    char* denumire; // membru non-static
  
- static int numarConifere;​ // membru static -> in acest exemplu este folosit pe post de contor de instante pentru clasa Conifer+    ​static int numarConifere;​ // membru static -> in acest exemplu este folosit pe post de contor de instante pentru clasa Conifer
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime, const char* denumire);​ +    Conifer(const double& pret, const float& inaltime, const char* denumire);​ 
- Conifer(const Conifer&​ conifer); +    Conifer(const Conifer&​ conifer); 
- Conifer&​ operator=(const Conifer&​ conifer); // operatorul de asignare +    Conifer&​ operator=(const Conifer&​ conifer); // operatorul de asignare 
- ~Conifer();​+    ~Conifer();
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const; +    float getInaltime() const; 
- char* getDenumire() const;+    char* getDenumire() const;
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);​ +    void setInaltime(const float& inaltime);​ 
- void setDenumire(const char* denumire);+    void setDenumire(const char* denumire);
 }; };
 </​code>​ </​code>​
Line 515: Line 515:
 Conifer::​Conifer() Conifer::​Conifer()
 { {
- pret = 0.0; +    ​pret = 0.0; 
- inaltime = 0.0f; +    inaltime = 0.0f; 
- denumire = nullptr; +    denumire = nullptr; 
- numarConifere++;​+    numarConifere++;​
 } }
  
 Conifer::​Conifer(const double& pret, const float& inaltime, const char* denumire) Conifer::​Conifer(const double& pret, const float& inaltime, const char* denumire)
 { {
- this->​pret = pret; +    ​this->​pret = pret; 
- this->​inaltime = inaltime;+    this->​inaltime = inaltime;
  
- if (denumire != nullptr) +    ​if (denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(denumire) + 1]; +        this->​denumire = new char[strlen(denumire) + 1]; 
- strcpy(this->​denumire,​ denumire);​ +        strcpy(this->​denumire,​ denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
  
- numarConifere++;​+    ​numarConifere++;​
 } }
  
 Conifer::​Conifer(const Conifer&​ conifer) Conifer::​Conifer(const Conifer&​ conifer)
 { {
- this->​pret = conifer.pret;​ +    ​this->​pret = conifer.pret;​ 
- this->​inaltime = conifer.inaltime;​+    this->​inaltime = conifer.inaltime;​
  
- if (conifer.denumire != nullptr) +    ​if (conifer.denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(conifer.denumire) + 1]; +        this->​denumire = new char[strlen(conifer.denumire) + 1]; 
- strcpy(this->​denumire,​ conifer.denumire);​ +        strcpy(this->​denumire,​ conifer.denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
  
- numarConifere++;​+    ​numarConifere++;​
 } }
  
 Conifer::​~Conifer() Conifer::​~Conifer()
 { {
- if (denumire != nullptr) +    ​if (denumire != nullptr) 
-+    
- delete[] denumire; +        delete[] denumire; 
- }+    }
  
- numarConifere--;​+    ​numarConifere--;​
 } }
 </​code>​ </​code>​
Line 583: Line 583:
 class Conifer class Conifer
 { {
- double pret; +    ​double pret; 
- float inaltime; +    float inaltime; 
- char* denumire;+    char* denumire;
  
- static int numarConifere;​+    ​static int numarConifere;​
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime, const char* denumire);​ +    Conifer(const double& pret, const float& inaltime, const char* denumire);​ 
- Conifer(const Conifer&​ conifer); +    Conifer(const Conifer&​ conifer); 
- Conifer&​ operator=(const Conifer&​ conifer); +    Conifer&​ operator=(const Conifer&​ conifer); 
- ~Conifer();​+    ~Conifer();
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const; +    float getInaltime() const; 
- char* getDenumire() const;+    char* getDenumire() const;
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);​ +    void setInaltime(const float& inaltime);​ 
- void setDenumire(const char* denumire);+    void setDenumire(const char* denumire);
  
- static int getNumarConifere();​ // functie statica+    ​static int getNumarConifere();​ // functie statica
 }; };
 </​code>​ </​code>​
Line 614: Line 614:
 int Conifer::​getNumarConifere() int Conifer::​getNumarConifere()
 { {
- return numarConifere;​+    ​return numarConifere;​
 } }
 </​code>​ </​code>​
Line 625: Line 625:
 int main() int main()
 { {
- std::cout << "​Numarul de conifere este: " << Conifer::​getNumarConifere() << '​\n';​+    ​std::cout << "​Numarul de conifere este: " << Conifer::​getNumarConifere() << '​\n';​
  
- Conifer c1;+    ​Conifer c1;
  
- std::cout << "​Numarul de conifere este: " << Conifer::​getNumarConifere() << '​\n';​ +    ​std::cout << "​Numarul de conifere este: " << Conifer::​getNumarConifere() << '​\n';​ 
- std::cout << "​Numarul de conifere este: " << c1.getNumarConifere() << '​\n';​+    std::cout << "​Numarul de conifere este: " << c1.getNumarConifere() << '​\n';​
  
- Conifer c2 = c1;+    ​Conifer c2 = c1;
  
- std::cout << "​Numarul de conifere este: " << c2.getNumarConifere() << '​\n';​+    ​std::cout << "​Numarul de conifere este: " << c2.getNumarConifere() << '​\n';​
  
- return 0;+    ​return 0;
 } }
 </​code>​ </​code>​
Line 655: Line 655:
 class Conifer class Conifer
 { {
- double pret; +    ​double pret; 
- float inaltime; +    float inaltime; 
- char* denumire;+    char* denumire;
  
- const int codUnic; // membru constant +    ​const int codUnic; // membru constant 
- static int numarConifere;​+    static int numarConifere;​
  
 public: public:
  
- Conifer();​ +    ​Conifer();​ 
- Conifer(const double& pret, const float& inaltime, const char* denumire);​ +    Conifer(const double& pret, const float& inaltime, const char* denumire);​ 
- Conifer(const Conifer&​ conifer); +    Conifer(const Conifer&​ conifer); 
- Conifer&​ operator=(const Conifer&​ conifer); +    Conifer&​ operator=(const Conifer&​ conifer); 
- ~Conifer();​+    ~Conifer();
  
- double getPret() const; +    ​double getPret() const; 
- float getInaltime() const; +    float getInaltime() const; 
- char* getDenumire() const; +    char* getDenumire() const; 
- const int getCodUnic() const; // accesor pentru membrul constant+    const int getCodUnic() const; // accesor pentru membrul constant
  
- void setPret(const double& pret); +    ​void setPret(const double& pret); 
- void setInaltime(const float& inaltime);​ +    void setInaltime(const float& inaltime);​ 
- void setDenumire(const char* denumire);+    void setDenumire(const char* denumire);
  
- static int getNumarConifere();​+    ​static int getNumarConifere();​
 }; };
 </​code>​ </​code>​
Line 690: Line 690:
 Conifer::​Conifer() : codUnic(++numarConifere) Conifer::​Conifer() : codUnic(++numarConifere)
 { {
- pret = 0.0; +    ​pret = 0.0; 
- inaltime = 0.0f; +    inaltime = 0.0f; 
- denumire = nullptr;+    denumire = nullptr;
 } }
  
 Conifer::​Conifer(const double& pret, const float& inaltime, const char* denumire) : codUnic(++numarConifere) Conifer::​Conifer(const double& pret, const float& inaltime, const char* denumire) : codUnic(++numarConifere)
 { {
- this->​pret = pret; +    ​this->​pret = pret; 
- this->​inaltime = inaltime;+    this->​inaltime = inaltime;
  
- if (denumire != nullptr) +    ​if (denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(denumire) + 1]; +        this->​denumire = new char[strlen(denumire) + 1]; 
- strcpy(this->​denumire,​ denumire);​ +        strcpy(this->​denumire,​ denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
 } }
  
 Conifer::​Conifer(const Conifer&​ conifer) : codUnic(++numarConifere) Conifer::​Conifer(const Conifer&​ conifer) : codUnic(++numarConifere)
 { {
- this->​pret = conifer.pret;​ +    ​this->​pret = conifer.pret;​ 
- this->​inaltime = conifer.inaltime;​+    this->​inaltime = conifer.inaltime;​
  
- if (conifer.denumire != nullptr) +    ​if (conifer.denumire != nullptr) 
-+    
- this->​denumire = new char[strlen(conifer.denumire) + 1]; +        this->​denumire = new char[strlen(conifer.denumire) + 1]; 
- strcpy(this->​denumire,​ conifer.denumire);​ +        strcpy(this->​denumire,​ conifer.denumire);​ 
-+    
- else +    else 
-+    
- this->​denumire = nullptr; +        this->​denumire = nullptr; 
- }+    }
 } }
  
 Conifer::​~Conifer() Conifer::​~Conifer()
 { {
- if (denumire != nullptr) +    ​if (denumire != nullptr) 
-+    
- delete[] denumire; +        delete[] denumire; 
- }+    }
  
- /* numarConifere--;​ // nu facem acest lucru deoarece putem avea id-uri duplicate ceea ce ar strica principiul unicitatii*/​+    ​/* numarConifere--;​ // nu facem acest lucru deoarece putem avea id-uri duplicate ceea ce ar strica principiul unicitatii*/​
 } }
  
 const int Conifer::​getCodUnic() const const int Conifer::​getCodUnic() const
 { {
- return codUnic;+    ​return codUnic;
 } }
 </​code>​ </​code>​
poo-is-ab/laboratoare/04.1758785218.txt.gz · Last modified: 2025/09/25 10:26 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