<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Costin.vasile1003</id>
	<title>WikiLabs - Contribuții utilizator [ro]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Costin.vasile1003"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php/Special:Contribu%C8%9Bii/Costin.vasile1003"/>
	<updated>2026-05-14T08:03:04Z</updated>
	<subtitle>Contribuții utilizator</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Programare_Orientat%C4%83_pe_Obiecte_(C%2B%2B)&amp;diff=8313</id>
		<title>Programare Orientată pe Obiecte (C++)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Programare_Orientat%C4%83_pe_Obiecte_(C%2B%2B)&amp;diff=8313"/>
		<updated>2026-03-24T13:28:11Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scopul laboratorului ==&lt;br /&gt;
&lt;br /&gt;
Scopul laboratorului de Programare Orientată Obiect este de a introduce studentului conceptele paradigmei de programare orientată pe obiecte, aprofundarea limbajului C++, precum și familiarizarea cu tehnicile de programare specifice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt; Toate lucrările acestui laborator pleacă de la premiza că sunteți deja familiarizați cu sintaxa limbajului C.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt; Toate fișierele/ programele scrise la fiecare laborator se pot salva, pe e-mail, pe un stick USB, pe un repository personal de Git sau pe Moodle.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Platforme de laborator ==&lt;br /&gt;
&lt;br /&gt;
# [[C++ POO Lab Lucrarea 1]] - recapitulare: pointeri și structuri&lt;br /&gt;
# [[C++ POO Lab Lucrarea 2]] - paradigme de programare; clasa, obiectul, câmpul și metoda; supraîncărcarea; constructorul; încapsularea și modificatorii de acces&lt;br /&gt;
# [[C++ POO Lab Lucrarea 3]] - destructorul; referința; metode &amp;#039;&amp;#039;const-qualified&amp;#039;&amp;#039;; supraîncărcarea operatorilor; constructorul de copiere și operatorul de copiere prin atribuire&lt;br /&gt;
# [[C++ POO Lab Lucrarea 4]] - moștenirea; polimorfismul - metode virtuale și pur virtuale; clase abstracte&lt;br /&gt;
# [[C++ POO Lab Lucrarea 5]] - tratarea excepțiilor&lt;br /&gt;
&amp;lt;!-- # [[C++ POO Lab Lucrarea 6]] - aplicații grafice - QT. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorial Instalare g++ (Compilatorul C++ de la GNU) ==&lt;br /&gt;
&lt;br /&gt;
=== Instalare Windows ===&lt;br /&gt;
&lt;br /&gt;
Pentru Windows, compilatorul g++ poate fi instalat prin [http://www.mingw.org MinGW]. Urmăriți instrucțiunile de instalare și nu uitați să bifați compilatorul de C++ și utilitarul &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalare Linux ===&lt;br /&gt;
&lt;br /&gt;
Pentru Ubuntu, deschideți un terminal și tastați următoarea comandă:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install build-essential&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorial Instalare CLion IDE ==&lt;br /&gt;
&lt;br /&gt;
Pentru toate sistemele de operare, urmăriți instrucțiunile prezentate pe [https://www.jetbrains.com/help/clion/installation-guide.html site-ul oficial].&lt;br /&gt;
&lt;br /&gt;
== Tutorial Utilizare CLion IDE si Debugger ==&lt;br /&gt;
&lt;br /&gt;
[[C++ POO Lab Utile]] - utilizarea IDE-ului CLion și a debugger-ului&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=8312</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=8312"/>
		<updated>2026-03-24T13:23:40Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Metode &amp;#039;&amp;#039;const-qualified&amp;#039;&amp;#039;&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
* Constructorul de copiere&lt;br /&gt;
* Operatorul de copiere prin atribuire&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
== Introducere ==&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
Destructorul (pentru că nu poate exista decât unul singur în fiecare clasă), poate fi recunoscut după următoarele proprietăți:&lt;br /&gt;
# are numele format din caracterul &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; urmat de numele clasei;&lt;br /&gt;
# nu are argumente;&lt;br /&gt;
# nu are tip returnat (nici măcar &amp;#039;&amp;#039;&amp;#039;void&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
== Introducere ==&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt; O referință trebuie obligatoriu inițializată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
== Asocierea referințelor ==&lt;br /&gt;
&lt;br /&gt;
Asocierea între o referință și o variabilă este permanentă și nu putem asocia referința cu altă variabilă! Putem, în schimb, să asociem mai multe referințe cu aceeași variabilă.&lt;br /&gt;
Observați datele de ieșire ale următorului exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar_1 = 25;&lt;br /&gt;
    int numar_2 = 30;&lt;br /&gt;
&lt;br /&gt;
    int&amp;amp; r1Numar = numar_1;&lt;br /&gt;
    int&amp;amp; r2Numar = numar_1;&lt;br /&gt;
&lt;br /&gt;
    r1Numar = numar_2;&lt;br /&gt;
    r1Numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r1Numar:  &amp;quot; &amp;lt;&amp;lt; r1Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r2Numar:  &amp;quot; &amp;lt;&amp;lt; r2Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_1:  &amp;quot; &amp;lt;&amp;lt; numar_1  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_2:  &amp;quot; &amp;lt;&amp;lt; numar_2  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ieșire:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Valoarea lui r1Numar:  31&lt;br /&gt;
Valoarea lui r2Numar:  31&lt;br /&gt;
Valoarea lui numar_1:  31&lt;br /&gt;
Valoarea lui numar_2:  30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că expresia &amp;lt;code&amp;gt;r1Numar = numar_2;&amp;lt;/code&amp;gt; nu a asociat referința &amp;lt;code&amp;gt;r1Numar&amp;lt;/code&amp;gt; cu variabila &amp;lt;code&amp;gt;numar_2&amp;lt;/code&amp;gt;, ci a determinat copierea valorii &amp;lt;code&amp;gt;numar_2&amp;lt;/code&amp;gt; în variabila cu care &amp;lt;code&amp;gt;rNumar&amp;lt;/code&amp;gt; este asociată.&lt;br /&gt;
De asemenea, observăm că variabila &amp;lt;code&amp;gt;numar_1&amp;lt;/code&amp;gt; este asociată cu două referințe.&lt;br /&gt;
&lt;br /&gt;
O referință nu poate fi asociată cu o valoare. Următorul program va genera erori de compilare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int&amp;amp; rNumar = 20; // aceasta expresie nu este permisa&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Transmiterea argumentelor prin referință ==&lt;br /&gt;
&lt;br /&gt;
Utilitatea referințelor este evidențiată atunci când avem nevoie sa accesăm o variabilă din contexte diferite (precum două metode diferite). Folosind referințe putem economisi memorie, folosind același spațiu de memorie accesat cu două nume de variabile diferite. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;nu folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-value&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
În acest caz, de fiecare dată când funcția &amp;lt;code&amp;gt;concat&amp;lt;/code&amp;gt; este apelată, în memorie este alocat spațiu pentru două variabile noi ce iau valorile argumentelor. Acest lucru nu este eficient atunci când avem nevoie să transmitem informații de dimensiuni mari.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-value&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
std::string concat(std::string a, std::string b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    std::string a = &amp;quot;Ana are &amp;quot;;&lt;br /&gt;
    std::string b = &amp;quot;mere.&amp;quot;;&lt;br /&gt;
    std::string result = concat(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Rezultat: &amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru transmiterea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-reference&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, argumentele funcției nu sunt copii ale variabilelor, ci referințe către variabilele transmise funcției.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-reference&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
std::string concat(std::string &amp;amp; a, std::string &amp;amp; b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    std::string a = &amp;quot;Ana are &amp;quot;;&lt;br /&gt;
    std::string b = &amp;quot;mere.&amp;quot;;&lt;br /&gt;
    std::string result = concat(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Rezultat: &amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt; Deși transmiterea argumentelor prin referință eficientizează dimensiunea memoriei ocupate la &amp;#039;&amp;#039;runtime&amp;#039;&amp;#039;, argumentele funcțiilor vor trebui manipulate cu grijă; o modificare a acestora în corpul funcției se va reflecta și asupra variabilei transmise ca argument!&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;Sfat:&amp;lt;/font&amp;gt; Deoarece mecanismul folosit pentru referințe este de fapt tot bazat pe adrese de memorie (pointeri), evitarea copierii valorii are sens doar pentru valori mai mari decât dimensiunea unui pointer. Astfel, pentru valori primitive (int, float, long, double, uint64_t, char, etc.) nu este necesară transmiterea lor ca referință pentru evitarea copierii, ci doar dacă doriți modificarea variabilelor în funcție.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referințe constante (const) ==&lt;br /&gt;
&lt;br /&gt;
Pentru a evita problema menționată mai sus (modificarea accidentală a unei variabile transmise unei funcții ca referință), se introduce conceptul de referință constantă. Acest tip de referință poate fi folosită doar pentru citirea informațiilor dintr-un obiect sau accesarea valorii unei variabile, nu și pentru modificarea acestora. Declararea unei referințe constante se face folosind cuvântul cheie &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Iată un exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-reference&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
std::string concat(const std::string &amp;amp; s1, const std::string &amp;amp; s2){&lt;br /&gt;
    return s1 + s2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    std::string a = &amp;quot;Ana are &amp;quot;;&lt;br /&gt;
    std::string b = &amp;quot;mere.&amp;quot;;&lt;br /&gt;
    std::string result = concat(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Rezultat: &amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folosind referințele &amp;#039;&amp;#039;&amp;#039;s1&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;s2&amp;#039;&amp;#039;&amp;#039; se pot citi datele din variabilele &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039; din &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, dar fără a risca modificarea lor. Dacă se încearcă modificarea uneia din ele (de exemplu &amp;lt;code&amp;gt;s2 = &amp;quot;pere&amp;quot;;&amp;lt;/code&amp;gt;), se va genera o eroare de compilare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție: &amp;lt;/font&amp;gt;Spre deosebire de o referință non-const, o referință constantă se poate asocia și cu o valoare constantă: &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-const-reference&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
std::string concat(const std::string &amp;amp; s1, const std::string &amp;amp; s2){&lt;br /&gt;
    return s1 + s2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    std::string result = concat(&amp;quot;Ana are &amp;quot;, &amp;quot;mere.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Rezultat: &amp;quot; &amp;lt;&amp;lt; result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Metode &amp;#039;&amp;#039;const-qualified&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
În cazul în care un obiect este declarat &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt;, sau se accesează printr-o referință constantă, acest obiect nu poate fi modificat. Modificarea unui obiect înseamnă modificarea valorilor câmpurilor sale. Astfel, pe lângă faptul că nu putem atribui valori noi câmpurilor în cazul în care avem acces la ele, nu putem nici apela metode care au ca efect modificarea obiectului. Iată un exemplu mai jos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
class Animal {&lt;br /&gt;
public:&lt;br /&gt;
    std::string mName;&lt;br /&gt;
    std::string mColor;&lt;br /&gt;
    int mAge;&lt;br /&gt;
    bool mHasFeathers;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    void makeSound() {&lt;br /&gt;
        printf(&amp;quot;Animal %s makes a sound!\n&amp;quot;, mName.c_str());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // this is a getter method&lt;br /&gt;
    std::string getName() {&lt;br /&gt;
        return mName;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // this is a setter method&lt;br /&gt;
    void setAge(int age) {&lt;br /&gt;
        if(age &amp;gt; 0) {&lt;br /&gt;
            mAge = age;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    const Animal animal;&lt;br /&gt;
    animal.mName = &amp;quot;Cat&amp;quot;; // eroare de compilare - nu se poate modifica acest camp&lt;br /&gt;
    animal.makeSound(); // eroare de compilare - nu se poate apela aceasta metoda&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai sus, este evident că nu putem modifica membrul &amp;lt;code&amp;gt;mName&amp;lt;/code&amp;gt; al obiectului &amp;lt;code&amp;gt;animal&amp;lt;/code&amp;gt; pentru că acesta este declarat &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt;. Cu toate acestea, metoda &amp;lt;code&amp;gt;makeSound&amp;lt;/code&amp;gt; nu modifică obiectul (nu modifică niciunul din câmpurile sale la apelare), dar nici aceasta nu poate fi apelată. Motivul este dat de faptul că programatorul trebuie să specifice explicit către compilator care sunt metodele care nu modifică obiectul, compilatorul nu face aceste verificări automat. O metodă care nu modifică obiectul pentru care se apelează se declară &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt; și se numește &amp;#039;&amp;#039;const-qualified&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
class Animal {&lt;br /&gt;
public:&lt;br /&gt;
    std::string mName;&lt;br /&gt;
    std::string mColor;&lt;br /&gt;
    int mAge;&lt;br /&gt;
    bool mHasFeathers;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    void makeSound() const {&lt;br /&gt;
        printf(&amp;quot;Animal %s makes a sound!\n&amp;quot;, mName.c_str());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // this is a getter method&lt;br /&gt;
    std::string getName() const {&lt;br /&gt;
        return mName;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // this is a setter method&lt;br /&gt;
    void setAge(int age) {&lt;br /&gt;
        if(age &amp;gt; 0) {&lt;br /&gt;
            mAge = age;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    const Animal animal;&lt;br /&gt;
    animal.mName = &amp;quot;Cat&amp;quot;; // eroare de compilare - nu se poate modifica acest camp&lt;br /&gt;
    animal.makeSound(); // aici nu se mai produce nicio eroare de compilare, metoda makeSound este const-qualified&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deci, pentru obiecte constante sau folosind referințe constante, se pot apela doar metode const-qualified.&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să tratăm instanțele claselor (i.e. obiectele) așa cum tratăm tipurile de date fundamentale, trebuie să putem folosi aceiași operatori pe care îi folosim si cu tipurile fundamentale.&lt;br /&gt;
&lt;br /&gt;
Cunoaștem, de exemplu, faptul că putem aduna două valori de tip întreg folosind operatorul &amp;#039;+&amp;#039;. În mod similar, am dori să putem calcula și suma a două numere complexe definite de clasa &amp;lt;code&amp;gt;Complex&amp;lt;/code&amp;gt; din următorul exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
class Complex{&lt;br /&gt;
    double mReal;       // partea reala&lt;br /&gt;
    double mImaginar;   // partea imaginara&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul ce initializeaza campurile obiectului&lt;br /&gt;
     * &lt;br /&gt;
     * */    &lt;br /&gt;
    Complex(double real, double imaginar){&lt;br /&gt;
        mReal     = real;&lt;br /&gt;
        mImaginar = imaginar;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul fara argumente&lt;br /&gt;
     * &lt;br /&gt;
     * */&lt;br /&gt;
    Complex() = default;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: get_suma&lt;br /&gt;
     *&lt;br /&gt;
     * Intoarce suma (sub forma de obiect de tip Complex) dintre obiectul curent si obiectul primit ca argument&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex get_sum(Complex alt_numar){&lt;br /&gt;
        double real_rezultat     = mReal     + alt_numar.mReal;&lt;br /&gt;
        double imaginar_rezultat = mImaginar + alt_numar.mImaginar;&lt;br /&gt;
&lt;br /&gt;
        Complex rezultat(real_rezultat, imaginar_rezultat);&lt;br /&gt;
&lt;br /&gt;
        return  rezultat;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: afisare&lt;br /&gt;
     *&lt;br /&gt;
     * Afiseaza numarul complex in formatul a+bi&lt;br /&gt;
     * &lt;br /&gt;
     * */&lt;br /&gt;
    void afisare(){&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; mReal &amp;lt;&amp;lt; &amp;#039;+&amp;#039; &amp;lt;&amp;lt; mImaginar &amp;lt;&amp;lt; &amp;#039;i&amp;#039; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folosind cunoștințele acumulate până acum, putem realiza suma a doua obiecte de tip &amp;lt;code&amp;gt;Complex&amp;lt;/code&amp;gt; implementând metoda &amp;lt;code&amp;gt;get_suma&amp;lt;/code&amp;gt; din exemplul de mai sus. Totuși, aceasta nu ne permite să adunăm două obiecte de tip &amp;lt;code&amp;gt;Complex&amp;lt;/code&amp;gt; folosind operatorul &amp;#039;+&amp;#039;, așa cum dorim.&lt;br /&gt;
&lt;br /&gt;
Fie clasa &amp;lt;code&amp;gt;Complex&amp;lt;/code&amp;gt; definită anterior. Acesta este un exemplu de utilizare a funcției &amp;lt;code&amp;gt;get_sum&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    Complex complex_1 (5, 10);&lt;br /&gt;
    Complex complex_2 (-1, 3);&lt;br /&gt;
&lt;br /&gt;
    Complex suma = complex_1.get_sum(complex_2);&lt;br /&gt;
&lt;br /&gt;
    suma.afisare();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ieșire:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
4+13i&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supraîncărcarea operatorilor presupune implementarea uneia sau mai multor funcții speciale (numite funcții operator) ce descriu comportamentul operatorilor doriți.&lt;br /&gt;
&lt;br /&gt;
Numele unei astfel de funcții începe cu cuvântul cheie &amp;lt;code&amp;gt;operator&amp;lt;/code&amp;gt; și este urmat de simbolul operatorului supraîncărcat. De asemenea, la fel ca funcțiile obișnuite, operatorii vor avea tip de date returnat și (opțional) argumente.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei funcții operator: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;tip_returnat&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;operator&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;simbol&amp;#039;&amp;#039; (&amp;lt;&amp;#039;&amp;#039;lista argumentelor&amp;#039;&amp;#039;&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reguli generale ===&lt;br /&gt;
Supraîncărcarea operatorilor trebuie să respecte următoarele reguli:&lt;br /&gt;
# Prioritatea operatorilor nu poate fi schimbată (ex. &amp;#039;*&amp;#039; are prioritate față de &amp;#039;+&amp;#039;)&lt;br /&gt;
# Asociativitatea și comutativitatea operatorilor nu pot fi schimbate&lt;br /&gt;
# Numărul de operanzi ai unui operator nu poate fi schimbat (ex. operatorul &amp;#039;+&amp;#039; este binar, în timp ce &amp;#039;!&amp;#039; este unar)&lt;br /&gt;
# Nu pot fi supraîncărcați operatori noi, doar cei definiți în standardul C++. Consultați [https://en.cppreference.com/w/cpp/language/operators acest link] pentru lista operatorilor.&lt;br /&gt;
&lt;br /&gt;
=== Exemplu === &lt;br /&gt;
Metoda &amp;lt;code&amp;gt;get_sum&amp;lt;/code&amp;gt; din exemplul anterior este înlocuită în exemplul următor de operatorul &amp;#039;+&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Complex{&lt;br /&gt;
    double mReal;       // partea reala&lt;br /&gt;
    double mImaginar;   // partea imaginara&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul ce initializeaza campurile obiectului&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex(double real, double imaginar){&lt;br /&gt;
        mReal     = real;&lt;br /&gt;
        mImaginar = imaginar;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul fara argumente&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex() = default;&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: operator +&lt;br /&gt;
     *&lt;br /&gt;
     * Intoarce suma (sub forma de obiect de tip Complex) dintre obiectul curent si obiectul primit ca argument&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex operator +(Complex alt_numar){&lt;br /&gt;
        double real_rezultat     = mReal     + alt_numar.mReal;&lt;br /&gt;
        double imaginar_rezultat = mImaginar + alt_numar.mImaginar;&lt;br /&gt;
&lt;br /&gt;
        Complex rezultat(real_rezultat, imaginar_rezultat);&lt;br /&gt;
&lt;br /&gt;
        return  rezultat;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: afisare&lt;br /&gt;
     *&lt;br /&gt;
     * Afiseaza numarul complex in formatul a+bi&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    void afisare(){&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; mReal &amp;lt;&amp;lt; &amp;#039;+&amp;#039; &amp;lt;&amp;lt; mImaginar &amp;lt;&amp;lt; &amp;#039;i&amp;#039; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Complex complex_1 (5, 10);&lt;br /&gt;
    Complex complex_2 (-1, 3);&lt;br /&gt;
&lt;br /&gt;
    Complex suma = complex_1 + complex_2;&lt;br /&gt;
&lt;br /&gt;
    suma.afisare();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Constructorul de copiere =&lt;br /&gt;
&lt;br /&gt;
== Introducere ==&lt;br /&gt;
Obiectele se copiază în două situații:&lt;br /&gt;
# Atunci când se inițializează un obiect (i se atribuie o valoare la declarație);&lt;br /&gt;
# Atunci când se transmite un obiect către o funcție cu argumente de tip &amp;#039;&amp;#039;pass-by-value&amp;#039;&amp;#039;, deci nu ca referință.&lt;br /&gt;
# Atunci când se atribuie un obiect unui alt obiect (evident de același fel), în altă parte decât la inițializare.&lt;br /&gt;
&lt;br /&gt;
În primele două situații, această copiere se realizează de un constructor special, numit &amp;#039;&amp;#039;&amp;#039;constructor de copiere&amp;#039;&amp;#039;&amp;#039;. Acest constructor există implicit în toate clasele fiind adăugat de compilator. Copierea implicită pe care o face acesta este prin a duplica tot conținutul obiectului sursă, așa cum este acesta salvat în memorie. În multe situații, acest comportament este cel corect. Totuși, există și situații când acest comportament implicit trebuie modificat. Prin urmare trebuie definit explicit acest constructor de copiere în cadrul clasei. &lt;br /&gt;
&lt;br /&gt;
Forma unui constructor de copiere pentru o clasă oarecare &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
T(const T &amp;amp; source);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Prin urmare, constructorul de copiere ca lua ca argument o referință constantă la un alt obiect de același fel, care reprezintă sursa copierii de date.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt; Argumentul constructorului de copiere trebuie obligatoriu să fie de tip referință, pentru că în caz contrar, acesta trebuie copiat la apelul constructorului, copiere care se realizează folosind chiar constructorul de copiere, și deci rezultă un apel recursiv infinit. În acest caz veți primi o eroare de compilare.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
Reluând exemplul de la capitolul [[#Destructorul]], vom adăuga acum constructorul de copiere, pentru a evita crearea mai multor obiecte care să aibă pointer intern la aceeași zonă de memorie:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdint&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
    size_t dim;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        dim = dimensiune;&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Array(const Array &amp;amp; source) {&lt;br /&gt;
        arr = (int*) malloc(source.dim * sizeof(int));&lt;br /&gt;
        dim = source.dim;&lt;br /&gt;
        memcpy(arr, source.arr, dim * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructorul de copiere&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void test(Array array) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Mesaj din functie!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    Array copy = array;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost copiat!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    test(array);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Functia a fost apelata.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ieșire:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din constructorul de copiere&lt;br /&gt;
Obiectul a fost copiat!&lt;br /&gt;
Acest mesaj provine din constructorul de copiere&lt;br /&gt;
Mesaj din functie!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
Functia a fost apelata.&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operatorul de copiere prin atribuire =&lt;br /&gt;
== Introducere ==&lt;br /&gt;
În situația numărul 3 de mai sus (atunci când se atribuie un obiect unui alt obiect, în altă parte decât la inițializare), această copiere se realizează de un operator special, numit operatorul de copiere prin atribuie (copy-assignment operator). Acesta, similar cu constructorul de copiere, există în mod implicit, și copiază conținutul obiectului la nivel de byte. Și exact în același fel, câteodată este necesar să putem modifica acest comportament. &lt;br /&gt;
&lt;br /&gt;
Forma unui operator de copiere prin atribuire pentru o clasă oarecare &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
T&amp;amp; operator=(const T &amp;amp; source) {&lt;br /&gt;
    //aici se realizeaza copierea&lt;br /&gt;
    return *this;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Prin urmare, operatorul de copiere prin atribuire va lua ca argument o referință constantă la un alt obiect de același fel, care reprezintă sursa copierii de date. Acesta poate fi de tip &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, dar ca să se respecte specificația care spune că rezultatul operatorului de atribuire este valoarea atribuită, este recomandat ca întotdeauna această să întoarcă o referință la obiectul curent. Astfel, se pot realiza lanțuri de atribuiri.&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
&lt;br /&gt;
Continuând exemplul de mai sus, vom adăuga acum operatorul de copiere prin atribuire:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdint&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
    size_t dim;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        dim = dimensiune;&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Array(const Array &amp;amp; source) {&lt;br /&gt;
        arr = (int*) malloc(source.dim * sizeof(int));&lt;br /&gt;
        dim = source.dim;&lt;br /&gt;
        memcpy(arr, source.arr, dim * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructorul de copiere&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Array &amp;amp; operator=(const Array &amp;amp; source) {&lt;br /&gt;
        free(arr); // obiectul curent aici exista deja, deci trebuie sa stergem memoria alocata in constructor inainte de a aloca altceva&lt;br /&gt;
        arr = (int*) malloc(source.dim * sizeof(int));&lt;br /&gt;
        dim = source.dim;&lt;br /&gt;
        memcpy(arr, source.arr, dim * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din operatorul de copiere prin atribuire&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
        return *this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    Array other(5);&lt;br /&gt;
    other = array;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ieșire:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Acest mesaj provine din operatorul de copiere prin atribuire&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;The Rule of Three:&amp;lt;/font&amp;gt; O regulă cunoscută în limbajul C++ este următoarea: dacă aveți de nevoie să implementați explicit constructorul de copiere SAU operatorul de copiere prin atribuire SAU destructorul, atunci trebuie să le implementați pe toate trei!.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operatorii &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;=&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; cu tipuri de date simple.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocare dinamică pentru un element de tip &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
int* p = new int; &lt;br /&gt;
// stocheaza valoarea 10 la adresa stocata in pointerul p&lt;br /&gt;
*p = 10; &lt;br /&gt;
&lt;br /&gt;
// afișează valoarea stocată la adresa din pointerul p&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; &lt;br /&gt;
&lt;br /&gt;
// memoria alocată anterior este eliberată&lt;br /&gt;
delete p; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: alocare cu inițializare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
//    și inițializează valoarea de la acea adresă cu 25&lt;br /&gt;
int* p = new int(25);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocare cu alte tipuri simple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double* x = new double(3.14);&lt;br /&gt;
char* c = new char(&amp;#039;A&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; *c &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete c;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de date simple =&lt;br /&gt;
Sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// new&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;[&amp;lt;numar_elemente&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
// delete&lt;br /&gt;
delete[] &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; pentru memoria alocată dinamic sub forma unui vector, folosind &amp;lt;code&amp;gt;new[]&amp;lt;/code&amp;gt;, eliberarea trebuie făcută întotdeauna cu &amp;lt;code&amp;gt;delete[]&amp;lt;/code&amp;gt; și nu cu &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;. Folosirea lui &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocarea dinamică a unui vector == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int n = 5;&lt;br /&gt;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: suma numerelor dintr-un vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// se declara n si se citeste de la tastatura dimensiunea vectorului&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
// se aloca dinamic vectorul de n elemente&lt;br /&gt;
int* v = new int[n];&lt;br /&gt;
&lt;br /&gt;
// se citesc de la tastatura elementele vectorului&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
&lt;br /&gt;
// se calculeaza suma tuturor elementelor din vector&lt;br /&gt;
int suma = 0;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    suma += v[i];&lt;br /&gt;
&lt;br /&gt;
// afisarea sumei&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;Suma = &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
// se elibereaza memoria alocata anterior&lt;br /&gt;
delete[] v;&lt;br /&gt;
v = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
La fel ca la tipurile de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie va aloca memorie pentru noul obiect și va apela constructorul fără argumente.&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să apelăm constructorul cu parametri, vom folosi următoarea sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;(&amp;lt;argumente_constructor&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru distrugerea obiectului se foloseste in continuare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: obiect creat dinamic folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // alocă memorie pentru un obiect de tip Punct și apelează constructorul implicit al clasei&lt;br /&gt;
    Punct* p = new Punct;&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: obiect creat dinamic folosind un constructor cu parametri ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // aloca memorie si apeleaza constructorul cu parametri&lt;br /&gt;
    Punct* p = new Punct(3, 4);&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocarea dinamică și constructorul de copiere ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Punct(const Punct&amp;amp; other) {&lt;br /&gt;
        x = other.x;&lt;br /&gt;
        y = other.y;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor de copiere\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // obiectul p1 este creat obisnuit, apeland constructorul cu argumentr&lt;br /&gt;
    Punct p1(1, 2);&lt;br /&gt;
    // creează dinamic un nou obiect folosind constructorul de copiere&lt;br /&gt;
    Punct* p2 = new Punct(p1);&lt;br /&gt;
&lt;br /&gt;
    p2-&amp;gt;afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete p2;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diferența dintre &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; ==&lt;br /&gt;
În limbajul C, alocarea dinamică a memoriei se face în mod obișnuit cu funcția malloc. În C++, aceasta există în continuare pentru compatibilitate, dar pentru obiecte și clase nu este soluția potrivită.&lt;br /&gt;
&lt;br /&gt;
Dacă alocăm un obiect cu &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = new Test;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se întâmplă două lucruri:&lt;br /&gt;
* se rezervă memorie pentru obiect;&lt;br /&gt;
* se apelează constructorul obiectului&lt;br /&gt;
&lt;br /&gt;
Dacă încercăm să alocăm memorie pentru același tip folosind malloc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = (Test*)malloc(sizeof(Test));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se rezervă doar memorie brută. Constructorul nu este apelat. Cu alte cuvinte, &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; știe doar să rezerve un număr de octeți, dar nu știe nimic despre noțiunea de obiect, constructor sau clasă.&lt;br /&gt;
&lt;br /&gt;
Aceasta este diferența fundamentală:&lt;br /&gt;
* &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; alocă memorie;&lt;br /&gt;
* &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; alocă memorie și construiește obiectul.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
În cazul unui vector de obiecte, operatorul new[] rezervă memorie pentru toate elementele vectorului și apelează constructorul corespunzător pentru fiecare obiect, iar operatorul delete[] apelează destructorul fiecărui obiect și apoi eliberează memoria ocupată de întregul vector.&lt;br /&gt;
&lt;br /&gt;
La fel ca la vectorii de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nume_clasa&amp;gt;* &amp;lt;nume_vector&amp;gt; = new &amp;lt;nume_clasa&amp;gt;[&amp;lt;dimensiune&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: vector dinamic de obiecte folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // creează un vector dinamic cu 3 obiecte de tip Punct&lt;br /&gt;
    // Pentru fiecare element din vector este apelat constructorul implicit&lt;br /&gt;
    Punct* v = new Punct[3];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
        v[i].afiseaza(); // Accesul la elementele vectorului se face ca la un vector obișnuit:&lt;br /&gt;
&lt;br /&gt;
    // apelează destructorul pentru fiecare dintre cele 3 obiecte și apoi eliberează memoria vectorului&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: modificarea elementelor din vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor pentru punctul (&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void set(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 4;&lt;br /&gt;
    Punct* v = new Punct[n];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].set(i, i * 10);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Un astfel de obiect nu mai conține doar date simple, ci și un pointer către o zonă de memorie alocată dinamic. În acest caz, clasa trebuie să gestioneze corect această resursă: să o aloce atunci când obiectul este creat, să o elibereze atunci când obiectul este distrus și să o copieze corect atunci când obiectul este copiat sau atribuit altuia.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: un obiect care deține memorie dinamică ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    // clasa Text conține un pointer la char&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        // constructorul aloca memorie suficienta pentru pointerul s&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        // apoi se face copierea element cu element (in cazul acesta folosind strcpy)&lt;br /&gt;
        //     atribuirea directa s = p ar fi fost gresita; in acest caz s-ar copia pointerul, nu valorile catre care trimite acesta&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        // la distrugerea obiectului, memoria alocata in constructor trebuie eliberată&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t(&amp;quot;Laborator C++&amp;quot;);&lt;br /&gt;
    t.afiseaza();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: La distrugerea obiectului, memoria trebuie eliberată ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t1(&amp;quot;C++&amp;quot;);&lt;br /&gt;
    // copiere superficiala (shallow copy)&lt;br /&gt;
    Text t2 = t1;&lt;br /&gt;
&lt;br /&gt;
    t1.afiseaza();&lt;br /&gt;
    t2.afiseaza();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La prima vedere, codul pare corect. Totuși, el ascunde o problemă gravă.&lt;br /&gt;
Pentru că noi nu am definit un constructor de copiere, compilatorul generează automat unul implicit. Acesta copiază fiecare membru „ca atare”. În consecință, pointerul s din t2 va primi exact aceeași adresă ca pointerul s din t1.&lt;br /&gt;
&lt;br /&gt;
Cu alte cuvinte, după copiere:&lt;br /&gt;
* t1.s și t2.s indică spre aceeași zonă de memorie;&lt;br /&gt;
* nu există două copii ale textului, ci doar două pointere către același text.&lt;br /&gt;
&lt;br /&gt;
Aceasta se numește copiere superficială (shallow copy).&lt;br /&gt;
&lt;br /&gt;
Dacă două obiecte indică spre aceeași zonă de memorie, atunci la distrugerea lor fiecare destructor va încerca să elibereze aceeași zonă:&lt;br /&gt;
* destructorul lui t2 face delete[] s;&lt;br /&gt;
* destructorul lui t1 face din nou delete[] s.&lt;br /&gt;
&lt;br /&gt;
Rezultatul este o dublă eliberare a memoriei, ceea ce produce comportament nedefinit.&lt;br /&gt;
&lt;br /&gt;
Prin urmare, pentru clasele care conțin pointeri spre memorie alocată dinamic, copierea superficială este greșită.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: copiere profundă ==&lt;br /&gt;
Pentru a evita problema copierii superficiale, fiecare obiect trebuie să aibă propria sa copie a datelor. Cu alte cuvinte, la copiere nu trebuie copiată doar adresa, ci trebuie alocată o nouă zonă de memorie și copiat conținutul în ea.&lt;br /&gt;
&lt;br /&gt;
Aceasta se numește copiere profundă (deep copy).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // constructor de copiere&lt;br /&gt;
    Text(const Text&amp;amp; other) {&lt;br /&gt;
        s = new char[strlen(other.s) + 1];&lt;br /&gt;
        strcpy(s, other.s);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // operatorul de atribuire&lt;br /&gt;
    Text&amp;amp; operator=(const Text&amp;amp; other) {&lt;br /&gt;
        // verifica daca nu se incearca autoatribuire&lt;br /&gt;
        if (this != &amp;amp;other) {&lt;br /&gt;
            // elibereaza memoria veche&lt;br /&gt;
            delete[] s;&lt;br /&gt;
            // aloca memorie noua si copiaza datele&lt;br /&gt;
            s = new char[strlen(other.s) + 1];&lt;br /&gt;
            strcpy(s, other.s);&lt;br /&gt;
        }&lt;br /&gt;
        return *this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t1(&amp;quot;Laborator&amp;quot;);&lt;br /&gt;
    Text t2(&amp;quot;Initial&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    t2 = t1;&lt;br /&gt;
&lt;br /&gt;
    t1.afiseaza();&lt;br /&gt;
    t2.afiseaza();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8311</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8311"/>
		<updated>2026-03-24T13:18:27Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; cu tipuri de date simple.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocare dinamică pentru un element de tip &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
int* p = new int; &lt;br /&gt;
// stocheaza valoarea 10 la adresa stocata in pointerul p&lt;br /&gt;
*p = 10; &lt;br /&gt;
&lt;br /&gt;
// afișează valoarea stocată la adresa din pointerul p&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; &lt;br /&gt;
&lt;br /&gt;
// memoria alocată anterior este eliberată&lt;br /&gt;
delete p; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: alocare cu inițializare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
//    și inițializează valoarea de la acea adresă cu 25&lt;br /&gt;
int* p = new int(25);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocare cu alte tipuri simple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double* x = new double(3.14);&lt;br /&gt;
char* c = new char(&amp;#039;A&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; *c &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete c;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de date simple =&lt;br /&gt;
Sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// new&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;[&amp;lt;numar_elemente&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
// delete&lt;br /&gt;
delete[] &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; pentru memoria alocată dinamic sub forma unui vector, folosind &amp;lt;code&amp;gt;new[]&amp;lt;/code&amp;gt;, eliberarea trebuie făcută întotdeauna cu &amp;lt;code&amp;gt;delete[]&amp;lt;/code&amp;gt; și nu cu &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;. Folosirea lui &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocarea dinamică a unui vector == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int n = 5;&lt;br /&gt;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: suma numerelor dintr-un vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// se declara n si se citeste de la tastatura dimensiunea vectorului&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
// se aloca dinamic vectorul de n elemente&lt;br /&gt;
int* v = new int[n];&lt;br /&gt;
&lt;br /&gt;
// se citesc de la tastatura elementele vectorului&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
&lt;br /&gt;
// se calculeaza suma tuturor elementelor din vector&lt;br /&gt;
int suma = 0;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    suma += v[i];&lt;br /&gt;
&lt;br /&gt;
// afisarea sumei&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;Suma = &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
// se elibereaza memoria alocata anterior&lt;br /&gt;
delete[] v;&lt;br /&gt;
v = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
La fel ca la tipurile de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie va aloca memorie pentru noul obiect și va apela constructorul fără argumente.&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să apelăm constructorul cu parametri, vom folosi următoarea sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;(&amp;lt;argumente_constructor&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru distrugerea obiectului se foloseste in continuare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: obiect creat dinamic folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // alocă memorie pentru un obiect de tip Punct și apelează constructorul implicit al clasei&lt;br /&gt;
    Punct* p = new Punct;&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: obiect creat dinamic folosind un constructor cu parametri ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // aloca memorie si apeleaza constructorul cu parametri&lt;br /&gt;
    Punct* p = new Punct(3, 4);&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocarea dinamică și constructorul de copiere ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Punct(const Punct&amp;amp; other) {&lt;br /&gt;
        x = other.x;&lt;br /&gt;
        y = other.y;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor de copiere\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // obiectul p1 este creat obisnuit, apeland constructorul cu argumentr&lt;br /&gt;
    Punct p1(1, 2);&lt;br /&gt;
    // creează dinamic un nou obiect folosind constructorul de copiere&lt;br /&gt;
    Punct* p2 = new Punct(p1);&lt;br /&gt;
&lt;br /&gt;
    p2-&amp;gt;afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete p2;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diferența dintre &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; ==&lt;br /&gt;
În limbajul C, alocarea dinamică a memoriei se face în mod obișnuit cu funcția malloc. În C++, aceasta există în continuare pentru compatibilitate, dar pentru obiecte și clase nu este soluția potrivită.&lt;br /&gt;
&lt;br /&gt;
Dacă alocăm un obiect cu &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = new Test;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se întâmplă două lucruri:&lt;br /&gt;
* se rezervă memorie pentru obiect;&lt;br /&gt;
* se apelează constructorul obiectului&lt;br /&gt;
&lt;br /&gt;
Dacă încercăm să alocăm memorie pentru același tip folosind malloc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = (Test*)malloc(sizeof(Test));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se rezervă doar memorie brută. Constructorul nu este apelat. Cu alte cuvinte, &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; știe doar să rezerve un număr de octeți, dar nu știe nimic despre noțiunea de obiect, constructor sau clasă.&lt;br /&gt;
&lt;br /&gt;
Aceasta este diferența fundamentală:&lt;br /&gt;
* &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; alocă memorie;&lt;br /&gt;
* &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; alocă memorie și construiește obiectul.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
În cazul unui vector de obiecte, operatorul new[] rezervă memorie pentru toate elementele vectorului și apelează constructorul corespunzător pentru fiecare obiect, iar operatorul delete[] apelează destructorul fiecărui obiect și apoi eliberează memoria ocupată de întregul vector.&lt;br /&gt;
&lt;br /&gt;
La fel ca la vectorii de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nume_clasa&amp;gt;* &amp;lt;nume_vector&amp;gt; = new &amp;lt;nume_clasa&amp;gt;[&amp;lt;dimensiune&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: vector dinamic de obiecte folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // creează un vector dinamic cu 3 obiecte de tip Punct&lt;br /&gt;
    // Pentru fiecare element din vector este apelat constructorul implicit&lt;br /&gt;
    Punct* v = new Punct[3];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
        v[i].afiseaza(); // Accesul la elementele vectorului se face ca la un vector obișnuit:&lt;br /&gt;
&lt;br /&gt;
    // apelează destructorul pentru fiecare dintre cele 3 obiecte și apoi eliberează memoria vectorului&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: modificarea elementelor din vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor pentru punctul (&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void set(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 4;&lt;br /&gt;
    Punct* v = new Punct[n];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].set(i, i * 10);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Un astfel de obiect nu mai conține doar date simple, ci și un pointer către o zonă de memorie alocată dinamic. În acest caz, clasa trebuie să gestioneze corect această resursă: să o aloce atunci când obiectul este creat, să o elibereze atunci când obiectul este distrus și să o copieze corect atunci când obiectul este copiat sau atribuit altuia.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: un obiect care deține memorie dinamică ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    // clasa Text conține un pointer la char&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        // constructorul aloca memorie suficienta pentru pointerul s&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        // apoi se face copierea element cu element (in cazul acesta folosind strcpy)&lt;br /&gt;
        //     atribuirea directa s = p ar fi fost gresita; in acest caz s-ar copia pointerul, nu valorile catre care trimite acesta&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        // la distrugerea obiectului, memoria alocata in constructor trebuie eliberată&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t(&amp;quot;Laborator C++&amp;quot;);&lt;br /&gt;
    t.afiseaza();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: La distrugerea obiectului, memoria trebuie eliberată ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t1(&amp;quot;C++&amp;quot;);&lt;br /&gt;
    // copiere superficiala (shallow copy)&lt;br /&gt;
    Text t2 = t1;&lt;br /&gt;
&lt;br /&gt;
    t1.afiseaza();&lt;br /&gt;
    t2.afiseaza();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La prima vedere, codul pare corect. Totuși, el ascunde o problemă gravă.&lt;br /&gt;
Pentru că noi nu am definit un constructor de copiere, compilatorul generează automat unul implicit. Acesta copiază fiecare membru „ca atare”. În consecință, pointerul s din t2 va primi exact aceeași adresă ca pointerul s din t1.&lt;br /&gt;
&lt;br /&gt;
Cu alte cuvinte, după copiere:&lt;br /&gt;
* t1.s și t2.s indică spre aceeași zonă de memorie;&lt;br /&gt;
* nu există două copii ale textului, ci doar două pointere către același text.&lt;br /&gt;
&lt;br /&gt;
Aceasta se numește copiere superficială (shallow copy).&lt;br /&gt;
&lt;br /&gt;
Dacă două obiecte indică spre aceeași zonă de memorie, atunci la distrugerea lor fiecare destructor va încerca să elibereze aceeași zonă:&lt;br /&gt;
* destructorul lui t2 face delete[] s;&lt;br /&gt;
* destructorul lui t1 face din nou delete[] s.&lt;br /&gt;
&lt;br /&gt;
Rezultatul este o dublă eliberare a memoriei, ceea ce produce comportament nedefinit.&lt;br /&gt;
&lt;br /&gt;
Prin urmare, pentru clasele care conțin pointeri spre memorie alocată dinamic, copierea superficială este greșită.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: copiere profundă ==&lt;br /&gt;
Pentru a evita problema copierii superficiale, fiecare obiect trebuie să aibă propria sa copie a datelor. Cu alte cuvinte, la copiere nu trebuie copiată doar adresa, ci trebuie alocată o nouă zonă de memorie și copiat conținutul în ea.&lt;br /&gt;
&lt;br /&gt;
Aceasta se numește copiere profundă (deep copy).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // constructor de copiere&lt;br /&gt;
    Text(const Text&amp;amp; other) {&lt;br /&gt;
        s = new char[strlen(other.s) + 1];&lt;br /&gt;
        strcpy(s, other.s);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // operatorul de atribuire&lt;br /&gt;
    Text&amp;amp; operator=(const Text&amp;amp; other) {&lt;br /&gt;
        // verifica daca nu se incearca autoatribuire&lt;br /&gt;
        if (this != &amp;amp;other) {&lt;br /&gt;
            // elibereaza memoria veche&lt;br /&gt;
            delete[] s;&lt;br /&gt;
            // aloca memorie noua si copiaza datele&lt;br /&gt;
            s = new char[strlen(other.s) + 1];&lt;br /&gt;
            strcpy(s, other.s);&lt;br /&gt;
        }&lt;br /&gt;
        return *this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t1(&amp;quot;Laborator&amp;quot;);&lt;br /&gt;
    Text t2(&amp;quot;Initial&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    t2 = t1;&lt;br /&gt;
&lt;br /&gt;
    t1.afiseaza();&lt;br /&gt;
    t2.afiseaza();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8310</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8310"/>
		<updated>2026-03-24T13:15:10Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; cu tipuri de date simple.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocare dinamică pentru un element de tip &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
int* p = new int; &lt;br /&gt;
// stocheaza valoarea 10 la adresa stocata in pointerul p&lt;br /&gt;
*p = 10; &lt;br /&gt;
&lt;br /&gt;
// afișează valoarea stocată la adresa din pointerul p&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; &lt;br /&gt;
&lt;br /&gt;
// memoria alocată anterior este eliberată&lt;br /&gt;
delete p; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: alocare cu inițializare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
//    și inițializează valoarea de la acea adresă cu 25&lt;br /&gt;
int* p = new int(25);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocare cu alte tipuri simple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double* x = new double(3.14);&lt;br /&gt;
char* c = new char(&amp;#039;A&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; *c &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete c;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de date simple =&lt;br /&gt;
Sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// new&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;[&amp;lt;numar_elemente&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
// delete&lt;br /&gt;
delete[] &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; pentru memoria alocată dinamic sub forma unui vector, folosind &amp;lt;code&amp;gt;new[]&amp;lt;/code&amp;gt;, eliberarea trebuie făcută întotdeauna cu &amp;lt;code&amp;gt;delete[]&amp;lt;/code&amp;gt; și nu cu &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;. Folosirea lui &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocarea dinamică a unui vector == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int n = 5;&lt;br /&gt;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: suma numerelor dintr-un vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// se declara n si se citeste de la tastatura dimensiunea vectorului&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
// se aloca dinamic vectorul de n elemente&lt;br /&gt;
int* v = new int[n];&lt;br /&gt;
&lt;br /&gt;
// se citesc de la tastatura elementele vectorului&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
&lt;br /&gt;
// se calculeaza suma tuturor elementelor din vector&lt;br /&gt;
int suma = 0;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    suma += v[i];&lt;br /&gt;
&lt;br /&gt;
// afisarea sumei&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;Suma = &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
// se elibereaza memoria alocata anterior&lt;br /&gt;
delete[] v;&lt;br /&gt;
v = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
La fel ca la tipurile de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie va aloca memorie pentru noul obiect și va apela constructorul fără argumente.&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să apelăm constructorul cu parametri, vom folosi următoarea sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;(&amp;lt;argumente_constructor&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru distrugerea obiectului se foloseste in continuare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: obiect creat dinamic folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // alocă memorie pentru un obiect de tip Punct și apelează constructorul implicit al clasei&lt;br /&gt;
    Punct* p = new Punct;&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: obiect creat dinamic folosind un constructor cu parametri ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // aloca memorie si apeleaza constructorul cu parametri&lt;br /&gt;
    Punct* p = new Punct(3, 4);&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocarea dinamică și constructorul de copiere ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Punct(const Punct&amp;amp; other) {&lt;br /&gt;
        x = other.x;&lt;br /&gt;
        y = other.y;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor de copiere\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // obiectul p1 este creat obisnuit, apeland constructorul cu argumentr&lt;br /&gt;
    Punct p1(1, 2);&lt;br /&gt;
    // creează dinamic un nou obiect folosind constructorul de copiere&lt;br /&gt;
    Punct* p2 = new Punct(p1);&lt;br /&gt;
&lt;br /&gt;
    p2-&amp;gt;afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete p2;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diferența dintre &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; ==&lt;br /&gt;
În limbajul C, alocarea dinamică a memoriei se face în mod obișnuit cu funcția malloc. În C++, aceasta există în continuare pentru compatibilitate, dar pentru obiecte și clase nu este soluția potrivită.&lt;br /&gt;
&lt;br /&gt;
Dacă alocăm un obiect cu &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = new Test;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se întâmplă două lucruri:&lt;br /&gt;
* se rezervă memorie pentru obiect;&lt;br /&gt;
* se apelează constructorul obiectului&lt;br /&gt;
&lt;br /&gt;
Dacă încercăm să alocăm memorie pentru același tip folosind malloc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = (Test*)malloc(sizeof(Test));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se rezervă doar memorie brută. Constructorul nu este apelat. Cu alte cuvinte, &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; știe doar să rezerve un număr de octeți, dar nu știe nimic despre noțiunea de obiect, constructor sau clasă.&lt;br /&gt;
&lt;br /&gt;
Aceasta este diferența fundamentală:&lt;br /&gt;
* &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; alocă memorie;&lt;br /&gt;
* &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; alocă memorie și construiește obiectul.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
În cazul unui vector de obiecte, operatorul new[] rezervă memorie pentru toate elementele vectorului și apelează constructorul corespunzător pentru fiecare obiect, iar operatorul delete[] apelează destructorul fiecărui obiect și apoi eliberează memoria ocupată de întregul vector.&lt;br /&gt;
&lt;br /&gt;
La fel ca la vectorii de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nume_clasa&amp;gt;* &amp;lt;nume_vector&amp;gt; = new &amp;lt;nume_clasa&amp;gt;[&amp;lt;dimensiune&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: vector dinamic de obiecte folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // creează un vector dinamic cu 3 obiecte de tip Punct&lt;br /&gt;
    // Pentru fiecare element din vector este apelat constructorul implicit&lt;br /&gt;
    Punct* v = new Punct[3];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
        v[i].afiseaza(); // Accesul la elementele vectorului se face ca la un vector obișnuit:&lt;br /&gt;
&lt;br /&gt;
    // apelează destructorul pentru fiecare dintre cele 3 obiecte și apoi eliberează memoria vectorului&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: modificarea elementelor din vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor pentru punctul (&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void set(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 4;&lt;br /&gt;
    Punct* v = new Punct[n];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].set(i, i * 10);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Un astfel de obiect nu mai conține doar date simple, ci și un pointer către o zonă de memorie alocată dinamic. În acest caz, clasa trebuie să gestioneze corect această resursă: să o aloce atunci când obiectul este creat, să o elibereze atunci când obiectul este distrus și să o copieze corect atunci când obiectul este copiat sau atribuit altuia.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: un obiect care deține memorie dinamică ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    // clasa Text conține un pointer la char&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        // constructorul aloca memorie suficienta pentru pointerul s&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        // apoi se face copierea element cu element (in cazul acesta folosind strcpy)&lt;br /&gt;
        //     atribuirea directa s = p ar fi fost gresita; in acest caz s-ar copia pointerul, nu valorile catre care trimite acesta&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        // la distrugerea obiectului, memoria alocata in constructor trebuie eliberată&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t(&amp;quot;Laborator C++&amp;quot;);&lt;br /&gt;
    t.afiseaza();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: La distrugerea obiectului, memoria trebuie eliberată ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t1(&amp;quot;C++&amp;quot;);&lt;br /&gt;
    // copiere superficiala (shallow copy)&lt;br /&gt;
    Text t2 = t1;&lt;br /&gt;
&lt;br /&gt;
    t1.afiseaza();&lt;br /&gt;
    t2.afiseaza();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La prima vedere, codul pare corect. Totuși, el ascunde o problemă gravă.&lt;br /&gt;
Pentru că noi nu am definit un constructor de copiere, compilatorul generează automat unul implicit. Acesta copiază fiecare membru „ca atare”. În consecință, pointerul s din t2 va primi exact aceeași adresă ca pointerul s din t1.&lt;br /&gt;
&lt;br /&gt;
Cu alte cuvinte, după copiere:&lt;br /&gt;
* t1.s și t2.s indică spre aceeași zonă de memorie;&lt;br /&gt;
* nu există două copii ale textului, ci doar două pointere către același text.&lt;br /&gt;
&lt;br /&gt;
Aceasta se numește copiere superficială (shallow copy).&lt;br /&gt;
&lt;br /&gt;
Dacă două obiecte indică spre aceeași zonă de memorie, atunci la distrugerea lor fiecare destructor va încerca să elibereze aceeași zonă:&lt;br /&gt;
* destructorul lui t2 face delete[] s;&lt;br /&gt;
* destructorul lui t1 face din nou delete[] s.&lt;br /&gt;
&lt;br /&gt;
Rezultatul este o dublă eliberare a memoriei, ceea ce produce comportament nedefinit.&lt;br /&gt;
&lt;br /&gt;
Prin urmare, pentru clasele care conțin pointeri spre memorie alocată dinamic, copierea superficială este greșită.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: copiere profundă ==&lt;br /&gt;
Pentru a evita problema copierii superficiale, fiecare obiect trebuie să aibă propria sa copie a datelor. Cu alte cuvinte, la copiere nu trebuie copiată doar adresa, ci trebuie alocată o nouă zonă de memorie și copiat conținutul în ea.&lt;br /&gt;
&lt;br /&gt;
Aceasta se numește copiere profundă (deep copy).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Text(const Text&amp;amp; other) {&lt;br /&gt;
        s = new char[strlen(other.s) + 1];&lt;br /&gt;
        strcpy(s, other.s);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t1(&amp;quot;C++&amp;quot;);&lt;br /&gt;
    Text t2 = t1;&lt;br /&gt;
&lt;br /&gt;
    t1.afiseaza();&lt;br /&gt;
    t2.afiseaza();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8309</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8309"/>
		<updated>2026-03-24T13:09:23Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; cu tipuri de date simple.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocare dinamică pentru un element de tip &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
int* p = new int; &lt;br /&gt;
// stocheaza valoarea 10 la adresa stocata in pointerul p&lt;br /&gt;
*p = 10; &lt;br /&gt;
&lt;br /&gt;
// afișează valoarea stocată la adresa din pointerul p&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; &lt;br /&gt;
&lt;br /&gt;
// memoria alocată anterior este eliberată&lt;br /&gt;
delete p; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: alocare cu inițializare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
//    și inițializează valoarea de la acea adresă cu 25&lt;br /&gt;
int* p = new int(25);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocare cu alte tipuri simple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double* x = new double(3.14);&lt;br /&gt;
char* c = new char(&amp;#039;A&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; *c &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete c;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de date simple =&lt;br /&gt;
Sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// new&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;[&amp;lt;numar_elemente&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
// delete&lt;br /&gt;
delete[] &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; pentru memoria alocată dinamic sub forma unui vector, folosind &amp;lt;code&amp;gt;new[]&amp;lt;/code&amp;gt;, eliberarea trebuie făcută întotdeauna cu &amp;lt;code&amp;gt;delete[]&amp;lt;/code&amp;gt; și nu cu &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;. Folosirea lui &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocarea dinamică a unui vector == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int n = 5;&lt;br /&gt;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: suma numerelor dintr-un vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// se declara n si se citeste de la tastatura dimensiunea vectorului&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
// se aloca dinamic vectorul de n elemente&lt;br /&gt;
int* v = new int[n];&lt;br /&gt;
&lt;br /&gt;
// se citesc de la tastatura elementele vectorului&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
&lt;br /&gt;
// se calculeaza suma tuturor elementelor din vector&lt;br /&gt;
int suma = 0;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    suma += v[i];&lt;br /&gt;
&lt;br /&gt;
// afisarea sumei&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;Suma = &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
// se elibereaza memoria alocata anterior&lt;br /&gt;
delete[] v;&lt;br /&gt;
v = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
La fel ca la tipurile de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie va aloca memorie pentru noul obiect și va apela constructorul fără argumente.&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să apelăm constructorul cu parametri, vom folosi următoarea sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;(&amp;lt;argumente_constructor&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru distrugerea obiectului se foloseste in continuare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: obiect creat dinamic folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // alocă memorie pentru un obiect de tip Punct și apelează constructorul implicit al clasei&lt;br /&gt;
    Punct* p = new Punct;&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: obiect creat dinamic folosind un constructor cu parametri ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // aloca memorie si apeleaza constructorul cu parametri&lt;br /&gt;
    Punct* p = new Punct(3, 4);&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocarea dinamică și constructorul de copiere ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Punct(const Punct&amp;amp; other) {&lt;br /&gt;
        x = other.x;&lt;br /&gt;
        y = other.y;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor de copiere\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // obiectul p1 este creat obisnuit, apeland constructorul cu argumentr&lt;br /&gt;
    Punct p1(1, 2);&lt;br /&gt;
    // creează dinamic un nou obiect folosind constructorul de copiere&lt;br /&gt;
    Punct* p2 = new Punct(p1);&lt;br /&gt;
&lt;br /&gt;
    p2-&amp;gt;afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete p2;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diferența dintre &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; ==&lt;br /&gt;
În limbajul C, alocarea dinamică a memoriei se face în mod obișnuit cu funcția malloc. În C++, aceasta există în continuare pentru compatibilitate, dar pentru obiecte și clase nu este soluția potrivită.&lt;br /&gt;
&lt;br /&gt;
Dacă alocăm un obiect cu &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = new Test;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se întâmplă două lucruri:&lt;br /&gt;
* se rezervă memorie pentru obiect;&lt;br /&gt;
* se apelează constructorul obiectului&lt;br /&gt;
&lt;br /&gt;
Dacă încercăm să alocăm memorie pentru același tip folosind malloc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
Test* p = (Test*)malloc(sizeof(Test));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
se rezervă doar memorie brută. Constructorul nu este apelat. Cu alte cuvinte, &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; știe doar să rezerve un număr de octeți, dar nu știe nimic despre noțiunea de obiect, constructor sau clasă.&lt;br /&gt;
&lt;br /&gt;
Aceasta este diferența fundamentală:&lt;br /&gt;
* &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; alocă memorie;&lt;br /&gt;
* &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; alocă memorie și construiește obiectul.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
În cazul unui vector de obiecte, operatorul new[] rezervă memorie pentru toate elementele vectorului și apelează constructorul corespunzător pentru fiecare obiect, iar operatorul delete[] apelează destructorul fiecărui obiect și apoi eliberează memoria ocupată de întregul vector.&lt;br /&gt;
&lt;br /&gt;
La fel ca la vectorii de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nume_clasa&amp;gt;* &amp;lt;nume_vector&amp;gt; = new &amp;lt;nume_clasa&amp;gt;[&amp;lt;dimensiune&amp;gt;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: vector dinamic de obiecte folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // creează un vector dinamic cu 3 obiecte de tip Punct&lt;br /&gt;
    // Pentru fiecare element din vector este apelat constructorul implicit&lt;br /&gt;
    Punct* v = new Punct[3];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
        v[i].afiseaza(); // Accesul la elementele vectorului se face ca la un vector obișnuit:&lt;br /&gt;
&lt;br /&gt;
    // apelează destructorul pentru fiecare dintre cele 3 obiecte și apoi eliberează memoria vectorului&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: modificarea elementelor din vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor pentru punctul (&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void set(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n = 4;&lt;br /&gt;
    Punct* v = new Punct[n];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].set(i, i * 10);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        v[i].afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete[] v;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Un astfel de obiect nu mai conține doar date simple, ci și un pointer către o zonă de memorie alocată dinamic. În acest caz, clasa trebuie să gestioneze corect această resursă: să o aloce atunci când obiectul este creat, să o elibereze atunci când obiectul este distrus și să o copieze corect atunci când obiectul este copiat sau atribuit altuia.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: un obiect care deține memorie dinamică ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Text {&lt;br /&gt;
    // clasa Text conține un pointer la char&lt;br /&gt;
    char* s;&lt;br /&gt;
public:&lt;br /&gt;
    Text(const char* p) {&lt;br /&gt;
        // constructorul aloca memorie suficienta pentru pointerul s&lt;br /&gt;
        s = new char[strlen(p) + 1];&lt;br /&gt;
        // apoi se face copierea element cu element (in cazul acesta folosind strcpy)&lt;br /&gt;
        //     atribuirea directa s = p ar fi fost gresita; in acest caz s-ar copia pointerul, nu valorile catre care trimite acesta&lt;br /&gt;
        strcpy(s, p);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Text() {&lt;br /&gt;
        // la distrugerea obiectului, memoria alocata in constructor trebuie eliberată&lt;br /&gt;
        delete[] s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Text t(&amp;quot;Laborator C++&amp;quot;);&lt;br /&gt;
    t.afiseaza();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8308</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8308"/>
		<updated>2026-03-24T10:22:30Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; cu tipuri de date simple.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocare dinamică pentru un element de tip &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
int* p = new int; &lt;br /&gt;
// stocheaza valoarea 10 la adresa stocata in pointerul p&lt;br /&gt;
*p = 10; &lt;br /&gt;
&lt;br /&gt;
// afișează valoarea stocată la adresa din pointerul p&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; &lt;br /&gt;
&lt;br /&gt;
// memoria alocată anterior este eliberată&lt;br /&gt;
delete p; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: alocare cu inițializare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
//    și inițializează valoarea de la acea adresă cu 25&lt;br /&gt;
int* p = new int(25);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocare cu alte tipuri simple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double* x = new double(3.14);&lt;br /&gt;
char* c = new char(&amp;#039;A&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; *c &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete c;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de date simple =&lt;br /&gt;
Sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// new&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;[&amp;lt;numar_elemente&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
// delete&lt;br /&gt;
delete[] &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; pentru memoria alocată dinamic sub forma unui vector, folosind &amp;lt;code&amp;gt;new[]&amp;lt;/code&amp;gt;, eliberarea trebuie făcută întotdeauna cu &amp;lt;code&amp;gt;delete[]&amp;lt;/code&amp;gt; și nu cu &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;. Folosirea lui &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: alocarea dinamică a unui vector == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int n = 5;&lt;br /&gt;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: suma numerelor dintr-un vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// se declara n si se citeste de la tastatura dimensiunea vectorului&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
// se aloca dinamic vectorul de n elemente&lt;br /&gt;
int* v = new int[n];&lt;br /&gt;
&lt;br /&gt;
// se citesc de la tastatura elementele vectorului&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
&lt;br /&gt;
// se calculeaza suma tuturor elementelor din vector&lt;br /&gt;
int suma = 0;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    suma += v[i];&lt;br /&gt;
&lt;br /&gt;
// afisarea sumei&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;Suma = &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
// se elibereaza memoria alocata anterior&lt;br /&gt;
delete[] v;&lt;br /&gt;
v = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
La fel ca la tipurile de date simple, sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie va aloca memorie pentru noul obiect și va apela constructorul fără argumente.&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să apelăm constructorul cu parametri, vom folosi următoarea sintaxa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;numa_clasa&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;nume_clasa&amp;gt;(&amp;lt;argumente_constructor&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru distrugerea obiectului se foloseste in continuare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: obiect creat dinamic folosind constructorul implicit ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct() {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor implicit\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // alocă memorie pentru un obiect de tip Punct și apelează constructorul implicit al clasei&lt;br /&gt;
    Punct* p = new Punct;&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: obiect creat dinamic folosind un constructor cu parametri ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // aloca memorie si apeleaza constructorul cu parametri&lt;br /&gt;
    Punct* p = new Punct(3, 4);&lt;br /&gt;
    // deoarece avem un pointer la obiect, metodele si campurile sale sunt accesate cu -&amp;gt;&lt;br /&gt;
    p-&amp;gt;afiseaza();&lt;br /&gt;
    // apelează destructorul obiectului și apoi eliberează memoria ocupată de el&lt;br /&gt;
    delete p;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: alocarea dinamică și constructorul de copiere ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Punct {&lt;br /&gt;
    int x, y;&lt;br /&gt;
public:&lt;br /&gt;
    Punct(int a, int b) {&lt;br /&gt;
        x = a;&lt;br /&gt;
        y = b;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor cu parametri\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Punct(const Punct&amp;amp; other) {&lt;br /&gt;
        x = other.x;&lt;br /&gt;
        y = other.y;&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Constructor de copiere\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ~Punct() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Destructor\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void afiseaza() {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &amp;quot;)\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // obiectul p1 este creat obisnuit, apeland constructorul cu argumentr&lt;br /&gt;
    Punct p1(1, 2);&lt;br /&gt;
    // creează dinamic un nou obiect folosind constructorul de copiere&lt;br /&gt;
    Punct* p2 = new Punct(p1);&lt;br /&gt;
&lt;br /&gt;
    p2-&amp;gt;afiseaza();&lt;br /&gt;
&lt;br /&gt;
    delete p2;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Greșeli frecvente și comportamente periculoase =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8307</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8307"/>
		<updated>2026-03-24T09:46:08Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; cu tipuri de date simple.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 - alocare dinamică pentru un element de tip &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
int* p = new int; &lt;br /&gt;
// stocheaza valoarea 10 la adresa stocata in pointerul p&lt;br /&gt;
*p = 10; &lt;br /&gt;
&lt;br /&gt;
// afișează valoarea stocată la adresa din pointerul p&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; &lt;br /&gt;
&lt;br /&gt;
// memoria alocată anterior este eliberată&lt;br /&gt;
delete p; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 - alocare cu inițializare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
//    și inițializează valoarea de la acea adresă cu 25&lt;br /&gt;
int* p = new int(25);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3 - alocare cu alte tipuri simple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double* x = new double(3.14);&lt;br /&gt;
char* c = new char(&amp;#039;A&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; *c &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete c;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de date simple =&lt;br /&gt;
Sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// new&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;[&amp;lt;numar_elemente&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
// delete&lt;br /&gt;
delete[] &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; pentru memoria alocată dinamic sub forma unui vector, folosind &amp;lt;code&amp;gt;new[]&amp;lt;/code&amp;gt;, eliberarea trebuie făcută întotdeauna cu &amp;lt;code&amp;gt;delete[]&amp;lt;/code&amp;gt; și nu cu &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;. Folosirea lui &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 - alocarea dinamică a unui vector == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int n = 5;&lt;br /&gt;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 - suma numerelor dintr-un vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// se declara n si se citeste de la tastatura dimensiunea vectorului&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
// se aloca dinamic vectorul de n elemente&lt;br /&gt;
int* v = new int[n];&lt;br /&gt;
&lt;br /&gt;
// se citesc de la tastatura elementele vectorului&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
&lt;br /&gt;
// se calculeaza suma tuturor elementelor din vector&lt;br /&gt;
int suma = 0;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    suma += v[i];&lt;br /&gt;
&lt;br /&gt;
// afisarea sumei&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;Suma = &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
// se elibereaza memoria alocata anterior&lt;br /&gt;
delete[] v;&lt;br /&gt;
v = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Greșeli frecvente și comportamente periculoase =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8306</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8306"/>
		<updated>2026-03-24T09:40:15Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; cu tipuri de date simple.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 - alocare dinamică pentru un element de tip &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
int* p = new int; &lt;br /&gt;
// stocheaza valoarea 10 la adresa stocata in pointerul p&lt;br /&gt;
*p = 10; &lt;br /&gt;
&lt;br /&gt;
// afișează valoarea stocată la adresa din pointerul p&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; &lt;br /&gt;
&lt;br /&gt;
// memoria alocată anterior este eliberată&lt;br /&gt;
delete p; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 - alocare cu inițializare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg&lt;br /&gt;
//    și inițializează valoarea de la acea adresă cu 25&lt;br /&gt;
int* p = new int(25);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3 - alocare cu alte tipuri simple ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double* x = new double(3.14);&lt;br /&gt;
char* c = new char(&amp;#039;A&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
cout &amp;lt;&amp;lt; *x &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; *c &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
delete x;&lt;br /&gt;
delete c;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de date simple =&lt;br /&gt;
Sintaxa generală este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// new&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt;* &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;[&amp;lt;numar_elemente&amp;gt;];&lt;br /&gt;
&lt;br /&gt;
// delete&lt;br /&gt;
delete[] &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 - alocarea dinamică a unui vector == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int n = 5;&lt;br /&gt;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 - suma numerelor dintr-un vector ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// se declara n si se citeste de la tastatura dimensiunea vectorului&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
// se aloca dinamic vectorul de n elemente&lt;br /&gt;
int* v = new int[n];&lt;br /&gt;
&lt;br /&gt;
// se citesc de la tastatura elementele vectorului&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
&lt;br /&gt;
// se calculeaza suma tuturor elementelor din vector&lt;br /&gt;
int suma = 0;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    suma += v[i];&lt;br /&gt;
&lt;br /&gt;
// afisarea sumei&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;Suma = &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
// se elibereaza memoria alocata anterior&lt;br /&gt;
delete[] v;&lt;br /&gt;
v = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Greșeli frecvente și comportamente periculoase =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8305</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8305"/>
		<updated>2026-03-24T08:27:57Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Această linie:&lt;br /&gt;
* rezervă memorie pentru o variabilă de tipul specificat;&lt;br /&gt;
* returnează adresa acelei zone de memorie;&lt;br /&gt;
* memorează adresa într-un pointer de tip corespunzător&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
În plus față de varianta anterioară, această linie inițializează cu &amp;lt;valoare_initiala&amp;gt; valoarea stocată în memoria alocată.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Greșeli frecvente și comportamente periculoase =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8304</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8304"/>
		<updated>2026-03-24T08:17:37Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.&lt;br /&gt;
&lt;br /&gt;
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:&lt;br /&gt;
* numărul de elemente dintr-un vector este citit de la tastatură;&lt;br /&gt;
* un obiect trebuie să existe și după terminarea funcției în care a fost creat;&lt;br /&gt;
* o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;&lt;br /&gt;
* programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele&lt;br /&gt;
&lt;br /&gt;
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sau dacă se dorește și inițializare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tip_de_date&amp;gt; &amp;lt;nume_pointer&amp;gt; = new &amp;lt;tip_de_date&amp;gt;(&amp;lt;valoare_initiala&amp;gt;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Operatorul &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.&lt;br /&gt;
&lt;br /&gt;
Forma generală pentru &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
delete &amp;lt;nume_pointer&amp;gt;;&lt;br /&gt;
&amp;lt;nume_pointer&amp;gt; = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Greșeli frecvente și comportamente periculoase =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8303</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8303"/>
		<updated>2026-03-24T07:52:02Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int x;&lt;br /&gt;
Persoana p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Greșeli frecvente și comportamente periculoase =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Programare_Orientat%C4%83_pe_Obiecte_(C%2B%2B)&amp;diff=8302</id>
		<title>Programare Orientată pe Obiecte (C++)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Programare_Orientat%C4%83_pe_Obiecte_(C%2B%2B)&amp;diff=8302"/>
		<updated>2026-03-24T07:39:59Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scopul laboratorului ==&lt;br /&gt;
&lt;br /&gt;
Scopul laboratorului de Programare Orientată Obiect este de a introduce studentului conceptele paradigmei de programare orientată pe obiecte, aprofundarea limbajului C++, precum și familiarizarea cu tehnicile de programare specifice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt; Toate lucrările acestui laborator pleacă de la premiza că sunteți deja familiarizați cu sintaxa limbajului C.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Atenție:&amp;lt;/font&amp;gt; Toate fișierele/ programele scrise la fiecare laborator se pot salva, pe e-mail, pe un stick USB, pe un repository personal de Git sau pe Moodle.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Platforme de laborator ==&lt;br /&gt;
&lt;br /&gt;
# [[C++ POO Lab Lucrarea 1]] - recapitulare: pointeri și structuri&lt;br /&gt;
# [[C++ POO Lab Lucrarea 2]] - paradigme de programare; clasa, obiectul, câmpul și metoda; supraîncărcarea; constructorul; încapsularea și modificatorii de acces&lt;br /&gt;
# [[C++ POO Lab Lucrarea 3]] - destructorul; referința; metode &amp;#039;&amp;#039;const-qualified&amp;#039;&amp;#039;; supraîncărcarea operatorilor; constructorul de copiere și operatorul de copiere prin atribuire&lt;br /&gt;
# [[C++ POO Lab Lucrarea 4]] - moștenirea; polimorfismul - metode virtuale și pur virtuale; clase abstracte&lt;br /&gt;
# [[C++ POO Lab Lucrarea 5]] - tratarea excepțiilor&lt;br /&gt;
&amp;lt;!-- # [[C++ POO Lab Lucrarea 6]] - aplicații grafice - QT. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorial Instalare g++ (Compilatorul C++ de la GNU) ==&lt;br /&gt;
&lt;br /&gt;
=== Instalare Windows ===&lt;br /&gt;
&lt;br /&gt;
Pentru Windows, compilatorul g++ poate fi instalat prin [http://www.mingw.org MinGW]. Urmăriți instrucțiunile de instalare și nu uitați să bifați compilatorul de C++ și utilitarul &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalare Linux ===&lt;br /&gt;
&lt;br /&gt;
Pentru Ubuntu, deschideți un terminal și tastați următoarea comandă:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install build-essential&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tutorial Instalare CLion IDE ==&lt;br /&gt;
&lt;br /&gt;
Pentru toate sistemele de operare, urmăriți instrucțiunile prezentate pe [https://www.jetbrains.com/help/clion/installation-guide.html site-ul oficial].&lt;br /&gt;
&lt;br /&gt;
== Tutorial Utilizare CLion IDE si Debugger ==&lt;br /&gt;
&lt;br /&gt;
[[C++ POO Lab Utile]] - utilizarea IDE-ului CLion și a debugger-ului&lt;br /&gt;
&lt;br /&gt;
== Alte resurse ==&lt;br /&gt;
[[C++ POO Operatorii new si delete]]&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8301</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8301"/>
		<updated>2026-03-24T07:38:06Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[WIP Costin] Pagina este in lucru!&lt;br /&gt;
&lt;br /&gt;
= Introducere =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică pentru tipuri simple =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a obiectelor =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Alocarea dinamică a vectorilor de obiecte =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Obiecte care conțin memorie alocată dinamic =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;br /&gt;
&lt;br /&gt;
= Greșeli frecvente și comportamente periculoase =&lt;br /&gt;
Lorem ipsum dolor sit amet.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8300</id>
		<title>C++ POO Operatorii new si delete</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Operatorii_new_si_delete&amp;diff=8300"/>
		<updated>2026-03-24T07:27:27Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: Pagină nouă: WIP Costin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WIP Costin&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7249</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7249"/>
		<updated>2022-03-29T20:24:00Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
=== Asocierea referințelor ===&lt;br /&gt;
&lt;br /&gt;
Asocierea între o referință și o variabilă este permanentă și nu putem asocia referința cu altă variabilă! Putem, în schimb, să asociem mai multe referințe cu aceeași variabilă. &amp;lt;br&amp;gt;&lt;br /&gt;
Observați datele de ieșire ale următorului exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar_1 = 25;&lt;br /&gt;
    int numar_2 = 30;&lt;br /&gt;
&lt;br /&gt;
    int&amp;amp; r1Numar = numar_1;&lt;br /&gt;
    int&amp;amp; r2Numar = numar_1;&lt;br /&gt;
&lt;br /&gt;
    r1Numar = numar_2;&lt;br /&gt;
    r1Numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r1Numar:  &amp;quot; &amp;lt;&amp;lt; r1Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r2Numar:  &amp;quot; &amp;lt;&amp;lt; r2Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_1:  &amp;quot; &amp;lt;&amp;lt; numar_1  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_2:  &amp;quot; &amp;lt;&amp;lt; numar_2  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Valoarea lui r1Numar:  31&lt;br /&gt;
Valoarea lui r2Numar:  31&lt;br /&gt;
Valoarea lui numar_1:  31&lt;br /&gt;
Valoarea lui numar_2:  30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că expresia &amp;lt;code&amp;gt;r1Numar= numar_2;&amp;lt;/code&amp;gt; nu a asociat referința r1Numarcu variabila numar_2, ci a determinat copierea valorii numar_2 în variabila cu care rNumar este asociată. &amp;lt;br&amp;gt;&lt;br /&gt;
De asemenea, observăm că variabila numar_1 este asociată cu două referințe.&lt;br /&gt;
&lt;br /&gt;
O referință nu poate fi asociată cu o valoare. Următorul program va genera erori de compilare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int&amp;amp; rNumar = 20; // aceasta expresie nu este permisa&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pasarea argumentelor prin referință === &lt;br /&gt;
&lt;br /&gt;
Utilitatea referințelor este evidențiată atunci când avem nevoie sa accesăm o variabilă din contexte diferite (precum două metode diferite). Folosind referințe putem economisi memorie, folosind același spațiu de memorie accesat cu două nume de variabile diferite. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;nu folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-value&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, în memorie este alocat spațiu pentru două variabile noi ce iau valorile argumentelor. Acest lucru nu este eficient atunci când avem nevoie sa pasăm informații de dimensiuni mari.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-value&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int a, int b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-reference&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, argumentele funcției nu sunt copii ale variabilelor, ci referințe către variabilele pasate funcției.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-reference&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int&amp;amp; a, int&amp;amp; b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Atenție!&amp;#039;&amp;#039;&amp;#039; Deși pasarea argumentelor prin referință eficientizează dimensiunea memoriei ocupate la run-time, argumentele funcțiilor vor trebui manipulate cu grijă; o modificare a acestora în corpul funcției se va reflecta și asupra variabilei pasate ca argument!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să tratăm instanțele claselor (i.e. obiectele) așa cum tratăm tipurile de date fundamentale, trebuie să putem folosi aceiași operatori pe care îi folosim si cu tipurile fundamentale. &amp;lt;br&amp;gt;&lt;br /&gt;
Cunoaștem, de exemplu, faptul că putem aduna două valori de tip întreg folosind operatorul &amp;#039;+&amp;#039;. În mod similar, am dori să putem calcula și suma a două numere complexe definite de clasa Complex din următorul exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
class Complex{&lt;br /&gt;
    double mReal;       // partea reala&lt;br /&gt;
    double mImaginar;   // partea imaginara&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul ce initializeaza campurile obiectului&lt;br /&gt;
     * &lt;br /&gt;
     * */    &lt;br /&gt;
    Complex(double real, double imaginar){&lt;br /&gt;
        mReal     = real;&lt;br /&gt;
        mImaginar = imaginar;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul fara argumente&lt;br /&gt;
     * &lt;br /&gt;
     * */&lt;br /&gt;
    Complex() = default;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: get_suma&lt;br /&gt;
     *&lt;br /&gt;
     * Intoarce suma (sub forma de obiect de tip Complex) dintre obiectul curent si obiectul primit ca argument&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex get_sum(Complex alt_numar){&lt;br /&gt;
        double real_rezultat     = mReal     + alt_numar.mReal;&lt;br /&gt;
        double imaginar_rezultat = mImaginar + alt_numar.mImaginar;&lt;br /&gt;
&lt;br /&gt;
        Complex rezultat(real_rezultat, imaginar_rezultat);&lt;br /&gt;
&lt;br /&gt;
        return  rezultat;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: afisare&lt;br /&gt;
     *&lt;br /&gt;
     * Afiseaza numarul complex in formatul a+bi&lt;br /&gt;
     * &lt;br /&gt;
     * */&lt;br /&gt;
    void afisare(){&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; mReal &amp;lt;&amp;lt; &amp;#039;+&amp;#039; &amp;lt;&amp;lt; mImaginar &amp;lt;&amp;lt; &amp;#039;i&amp;#039; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folosind cunoștințele acumulate până acum, putem realiza suma a doua obiecte de tip Complex implementând funcția get_suma din exemplul de mai sus. &amp;lt;br&amp;gt;&lt;br /&gt;
Totuși, aceasta nu ne permite să adunăm două obiecte de tip complex folosind operatorul &amp;#039;+&amp;#039;, așa cum dorim.&lt;br /&gt;
&lt;br /&gt;
Fie clasa Complex definită anterior. Acesta este un exemplu de utilizare a funcției get_sum:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    Complex complex_1 (5, 10);&lt;br /&gt;
    Complex complex_2 (-1, 3);&lt;br /&gt;
&lt;br /&gt;
    Complex suma = complex_1.get_sum(complex_2);&lt;br /&gt;
&lt;br /&gt;
    suma.afisare();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
4+13i&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supraîncărcarea operatorilor presupune implementarea uneia sau mai multor funcții speciale (numite funcții operator) ce descriu comportamentul operatorilor doriți. &amp;lt;br&amp;gt;&lt;br /&gt;
Numele unei astfel de funcții începe cu cuvântul cheie operator și este urmat de simbolul operatorului supraîncărcat. De asemenea, la fel ca funcțiile obișnuite, operatorii vor avea tip de date returnat și (opțional) argumente.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei funcții operator: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;tip_returnat&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;operator&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;simbol&amp;#039;&amp;#039; (&amp;lt;&amp;#039;&amp;#039;lista argumentelor&amp;#039;&amp;#039;&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reguli generale ===&lt;br /&gt;
Supraîncărcarea operatorilor trebuie să respecte următoarele reguli:&lt;br /&gt;
# Prioritatea operatorilor nu poate fi schimbată (ex. &amp;#039;*&amp;#039; are prioritate față de &amp;#039;+&amp;#039;)&lt;br /&gt;
# Asociativitatea și comutativitatea operatorilor nu pot fi schimbate&lt;br /&gt;
# Numărul de operanzi ai unui operator nu poate fi schimbat (ex. operatorul &amp;#039;+&amp;#039; este binar, în timp ce &amp;#039;!&amp;#039; este unar)&lt;br /&gt;
# Nu pot fi supraîncărcați operatori noi, doar cei definiți în standardul C++. Consultați [https://en.cppreference.com/w/cpp/language/operators acest link] pentru lista operatorilor.&lt;br /&gt;
&lt;br /&gt;
=== Exemplu === &lt;br /&gt;
Metoda get_sum din exemplul anterior este înlocuită în exemplul următor de operatorul &amp;#039;+&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Complex{&lt;br /&gt;
    double mReal;       // partea reala&lt;br /&gt;
    double mImaginar;   // partea imaginara&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul ce initializeaza campurile obiectului&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex(double real, double imaginar){&lt;br /&gt;
        mReal     = real;&lt;br /&gt;
        mImaginar = imaginar;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul fara argumente&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex() = default;&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: operator +&lt;br /&gt;
     *&lt;br /&gt;
     * Intoarce suma (sub forma de obiect de tip Complex) dintre obiectul curent si obiectul primit ca argument&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex operator +(Complex alt_numar){&lt;br /&gt;
        double real_rezultat     = mReal     + alt_numar.mReal;&lt;br /&gt;
        double imaginar_rezultat = mImaginar + alt_numar.mImaginar;&lt;br /&gt;
&lt;br /&gt;
        Complex rezultat(real_rezultat, imaginar_rezultat);&lt;br /&gt;
&lt;br /&gt;
        return  rezultat;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: afisare&lt;br /&gt;
     *&lt;br /&gt;
     * Afiseaza numarul complex in formatul a+bi&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    void afisare(){&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; mReal &amp;lt;&amp;lt; &amp;#039;+&amp;#039; &amp;lt;&amp;lt; mImaginar &amp;lt;&amp;lt; &amp;#039;i&amp;#039; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Complex complex_1 (5, 10);&lt;br /&gt;
    Complex complex_2 (-1, 3);&lt;br /&gt;
&lt;br /&gt;
    Complex suma = complex_1 + complex_2;&lt;br /&gt;
&lt;br /&gt;
    suma.afisare();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7248</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7248"/>
		<updated>2022-03-29T20:01:57Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
=== Asocierea referințelor ===&lt;br /&gt;
&lt;br /&gt;
Asocierea între o referință și o variabilă este permanentă și nu putem asocia referința cu altă variabilă! Putem, în schimb, să asociem mai multe referințe cu aceeași variabilă. &amp;lt;br&amp;gt;&lt;br /&gt;
Observați datele de ieșire ale următorului exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar_1 = 25;&lt;br /&gt;
    int numar_2 = 30;&lt;br /&gt;
&lt;br /&gt;
    int&amp;amp; r1Numar = numar_1;&lt;br /&gt;
    int&amp;amp; r2Numar = numar_1;&lt;br /&gt;
&lt;br /&gt;
    r1Numar = numar_2;&lt;br /&gt;
    r1Numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r1Numar:  &amp;quot; &amp;lt;&amp;lt; r1Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r2Numar:  &amp;quot; &amp;lt;&amp;lt; r2Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_1:  &amp;quot; &amp;lt;&amp;lt; numar_1  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_2:  &amp;quot; &amp;lt;&amp;lt; numar_2  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Valoarea lui r1Numar:  31&lt;br /&gt;
Valoarea lui r2Numar:  31&lt;br /&gt;
Valoarea lui numar_1:  31&lt;br /&gt;
Valoarea lui numar_2:  30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că expresia &amp;lt;code&amp;gt;r1Numar= numar_2;&amp;lt;/code&amp;gt; nu a asociat referința r1Numarcu variabila numar_2, ci a determinat copierea valorii numar_2 în variabila cu care rNumar este asociată. &amp;lt;br&amp;gt;&lt;br /&gt;
De asemenea, observăm că variabila numar_1 este asociată cu două referințe.&lt;br /&gt;
&lt;br /&gt;
O referință nu poate fi asociată cu o valoare. Următorul program va genera erori de compilare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int&amp;amp; rNumar = 20; // aceasta expresie nu este permisa&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pasarea argumentelor prin referință === &lt;br /&gt;
&lt;br /&gt;
Utilitatea referințelor este evidențiată atunci când avem nevoie sa accesăm o variabilă din contexte diferite (precum două metode diferite). Folosind referințe putem economisi memorie, folosind același spațiu de memorie accesat cu două nume de variabile diferite. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;nu folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-value&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, în memorie este alocat spațiu pentru două variabile noi ce iau valorile argumentelor. Acest lucru nu este eficient atunci când avem nevoie sa pasăm informații de dimensiuni mari.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-value&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int a, int b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-reference&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, argumentele funcției nu sunt copii ale variabilelor, ci referințe către variabilele pasate funcției.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-reference&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int&amp;amp; a, int&amp;amp; b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Atenție!&amp;#039;&amp;#039;&amp;#039; Deși pasarea argumentelor prin referință eficientizează dimensiunea memoriei ocupate la run-time, argumentele funcțiilor vor trebui manipulate cu grijă; o modificare a acestora în corpul funcției se va reflecta și asupra variabilei pasate ca argument!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;br /&gt;
&lt;br /&gt;
Dacă dorim să tratăm instanțele claselor (i.e. obiectele) așa cum tratăm tipurile de date fundamentale, trebuie să putem folosi aceiași operatori pe care îi folosim si cu tipurile fundamentale. &amp;lt;br&amp;gt;&lt;br /&gt;
Cunoaștem, de exemplu, faptul că putem aduna două valori de tip întreg folosind operatorul &amp;#039;+&amp;#039;. În mod similar, am dori să putem calcula și suma a două numere complexe definite de clasa Complex din următorul exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
class Complex{&lt;br /&gt;
    double mReal;       // partea reala&lt;br /&gt;
    double mImaginar;   // partea imaginara&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul ce initializeaza campurile obiectului&lt;br /&gt;
     * &lt;br /&gt;
     * */    &lt;br /&gt;
    Complex(double real, double imaginar){&lt;br /&gt;
        mReal     = real;&lt;br /&gt;
        mImaginar = imaginar;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Constructorul fara argumente&lt;br /&gt;
     * &lt;br /&gt;
     * */&lt;br /&gt;
    Complex() = default;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: get_suma&lt;br /&gt;
     *&lt;br /&gt;
     * Intoarce suma (sub forma de obiect de tip Complex) dintre obiectul curent si obiectul primit ca argument&lt;br /&gt;
     *&lt;br /&gt;
     * */&lt;br /&gt;
    Complex get_sum(Complex alt_numar){&lt;br /&gt;
        double real_rezultat     = mReal     + alt_numar.mReal;&lt;br /&gt;
        double imaginar_rezultat = mImaginar + alt_numar.mImaginar;&lt;br /&gt;
&lt;br /&gt;
        Complex rezultat(real_rezultat, imaginar_rezultat);&lt;br /&gt;
&lt;br /&gt;
        return  rezultat;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Metoda: afisare&lt;br /&gt;
     *&lt;br /&gt;
     * Afiseaza numarul complex in formatul a+bi&lt;br /&gt;
     * &lt;br /&gt;
     * */&lt;br /&gt;
    void afisare(){&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; mReal &amp;lt;&amp;lt; &amp;#039;+&amp;#039; &amp;lt;&amp;lt; mImaginar &amp;lt;&amp;lt; &amp;#039;i&amp;#039; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folosind cunoștințele acumulate până acum, putem realiza suma a doua obiecte de tip Complex implementând funcția get_suma din exemplul de mai sus. &amp;lt;br&amp;gt;&lt;br /&gt;
Totuși, aceasta nu ne permite să adunăm două obiecte de tip complex folosind operatorul &amp;#039;+&amp;#039;, așa cum dorim.&lt;br /&gt;
&lt;br /&gt;
Fie clasa Complex definită anterior. Acesta este un exemplu de utilizare a funcției get_sum:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    Complex complex_1 (5, 10);&lt;br /&gt;
    Complex complex_2 (-1, 3);&lt;br /&gt;
&lt;br /&gt;
    Complex suma = complex_1.get_sum(complex_2);&lt;br /&gt;
&lt;br /&gt;
    suma.afisare();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
4+13i&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7247</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7247"/>
		<updated>2022-03-29T19:03:41Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
=== Asocierea referințelor ===&lt;br /&gt;
&lt;br /&gt;
Asocierea între o referință și o variabilă este permanentă și nu putem asocia referința cu altă variabilă! Putem, în schimb, să asociem mai multe referințe cu aceeași variabilă. &amp;lt;br&amp;gt;&lt;br /&gt;
Observați datele de ieșire ale următorului exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar_1 = 25;&lt;br /&gt;
    int numar_2 = 30;&lt;br /&gt;
&lt;br /&gt;
    int&amp;amp; r1Numar = numar_1;&lt;br /&gt;
    int&amp;amp; r2Numar = numar_1;&lt;br /&gt;
&lt;br /&gt;
    r1Numar = numar_2;&lt;br /&gt;
    r1Numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r1Numar:  &amp;quot; &amp;lt;&amp;lt; r1Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r2Numar:  &amp;quot; &amp;lt;&amp;lt; r2Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_1:  &amp;quot; &amp;lt;&amp;lt; numar_1  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_2:  &amp;quot; &amp;lt;&amp;lt; numar_2  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Valoarea lui r1Numar:  31&lt;br /&gt;
Valoarea lui r2Numar:  31&lt;br /&gt;
Valoarea lui numar_1:  31&lt;br /&gt;
Valoarea lui numar_2:  30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că expresia &amp;lt;code&amp;gt;r1Numar= numar_2;&amp;lt;/code&amp;gt; nu a asociat referința r1Numarcu variabila numar_2, ci a determinat copierea valorii numar_2 în variabila cu care rNumar este asociată. &amp;lt;br&amp;gt;&lt;br /&gt;
De asemenea, observăm că variabila numar_1 este asociată cu două referințe.&lt;br /&gt;
&lt;br /&gt;
O referință nu poate fi asociată cu o valoare. Următorul program va genera erori de compilare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int&amp;amp; rNumar = 20; // aceasta expresie nu este permisa&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pasarea argumentelor prin referință === &lt;br /&gt;
&lt;br /&gt;
Utilitatea referințelor este evidențiată atunci când avem nevoie sa accesăm o variabilă din contexte diferite (precum două metode diferite). Folosind referințe putem economisi memorie, folosind același spațiu de memorie accesat cu două nume de variabile diferite. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;nu folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-value&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, în memorie este alocat spațiu pentru două variabile noi ce iau valorile argumentelor. Acest lucru nu este eficient atunci când avem nevoie sa pasăm informații de dimensiuni mari.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-value&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int a, int b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-reference&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, argumentele funcției nu sunt copii ale variabilelor, ci referințe către variabilele pasate funcției.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-reference&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int&amp;amp; a, int&amp;amp; b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Atenție!&amp;#039;&amp;#039;&amp;#039; Deși pasarea argumentelor prin referință eficientizează dimensiunea memoriei ocupate la run-time, argumentele funcțiilor vor trebui manipulate cu grijă; o modificare a acestora în corpul funcției se va reflecta și asupra variabilei pasate ca argument!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7246</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7246"/>
		<updated>2022-03-29T19:00:21Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
=== Asocierea referințelor ===&lt;br /&gt;
&lt;br /&gt;
Asocierea între o referință și o variabilă este permanentă și nu putem asocia referința cu altă variabilă! Putem, în schimb, să asociem mai multe referințe cu aceeași variabilă. &amp;lt;br&amp;gt;&lt;br /&gt;
Observați datele de ieșire ale următorului exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar_1 = 25;&lt;br /&gt;
    int numar_2 = 30;&lt;br /&gt;
&lt;br /&gt;
    int&amp;amp; r1Numar = numar_1;&lt;br /&gt;
    int&amp;amp; r2Numar = numar_1;&lt;br /&gt;
&lt;br /&gt;
    r1Numar = numar_2;&lt;br /&gt;
    r1Numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r1Numar:  &amp;quot; &amp;lt;&amp;lt; r1Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r2Numar:  &amp;quot; &amp;lt;&amp;lt; r2Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_1:  &amp;quot; &amp;lt;&amp;lt; numar_1 &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_2:  &amp;quot; &amp;lt;&amp;lt; numar_2 &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Valoarea lui r1Numar:  31&lt;br /&gt;
Valoarea lui r2Numar:  31&lt;br /&gt;
Valoarea lui numar_1:  31&lt;br /&gt;
Valoarea lui numar_2:  30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că expresia &amp;lt;code&amp;gt;r1Numar= numar_2;&amp;lt;/code&amp;gt; nu a asociat referința r1Numarcu variabila numar_2, ci a determinat copierea valorii numar_2 în variabila cu care rNumar este asociată. &amp;lt;br&amp;gt;&lt;br /&gt;
De asemenea, observăm că variabila numar_1 este asociată cu două referințe.&lt;br /&gt;
&lt;br /&gt;
O referință nu poate fi asociată cu o valoare. Următorul program va genera erori de compilare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int&amp;amp; rNumar = 20; // aceasta expresie nu este permisa&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pasarea argumentelor prin referință === &lt;br /&gt;
&lt;br /&gt;
Utilitatea referințelor este evidențiată atunci când avem nevoie sa accesăm o variabilă din contexte diferite (precum două metode diferite). Folosind referințe putem economisi memorie, folosind același spațiu de memorie accesat cu două nume de variabile diferite. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;nu folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-value&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, în memorie este alocat spațiu pentru două variabile noi ce iau valorile argumentelor. Acest lucru nu este eficient atunci când avem nevoie sa pasăm informații de dimensiuni mari.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-value&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int a, int b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;folosește referințe&amp;#039;&amp;#039;&amp;#039; pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-reference&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, argumentele funcției nu sunt copii ale variabilelor, ci referințe către variabilele pasate funcției.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-reference&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int&amp;amp; a, int&amp;amp; b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Atenție!&amp;#039;&amp;#039;&amp;#039; Deși pasarea argumentelor prin referință eficientizează dimensiunea memoriei ocupate la run-time, argumentele funcțiilor vor trebui manipulate cu grijă; o modificare a acestora în corpul funcției se va reflecta și asupra variabilei pasate ca argument!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7245</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7245"/>
		<updated>2022-03-29T18:53:25Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
=== Asocierea referințelor ===&lt;br /&gt;
&lt;br /&gt;
Asocierea între o referință și o variabilă este permanentă și nu putem asocia referința cu altă variabilă! Putem, în schimb, să asociem mai multe referințe cu aceeași variabilă. &amp;lt;br&amp;gt;&lt;br /&gt;
Observați datele de ieșire ale următorului exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar_1 = 25;&lt;br /&gt;
    int numar_2 = 30;&lt;br /&gt;
&lt;br /&gt;
    int&amp;amp; r1Numar = numar_1;&lt;br /&gt;
    int&amp;amp; r2Numar = numar_1;&lt;br /&gt;
&lt;br /&gt;
    r1Numar = numar_2;&lt;br /&gt;
    r1Numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r1Numar:  &amp;quot; &amp;lt;&amp;lt; r1Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r2Numar:  &amp;quot; &amp;lt;&amp;lt; r2Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_1:  &amp;quot; &amp;lt;&amp;lt; numar_1 &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_2:  &amp;quot; &amp;lt;&amp;lt; numar_2 &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Valoarea lui r1Numar:  31&lt;br /&gt;
Valoarea lui r2Numar:  31&lt;br /&gt;
Valoarea lui numar_1:  31&lt;br /&gt;
Valoarea lui numar_2:  30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că expresia &amp;lt;code&amp;gt;r1Numar= numar_2;&amp;lt;/code&amp;gt; nu a asociat referința r1Numarcu variabila numar_2, ci a determinat copierea valorii numar_2 în variabila cu care rNumar este asociată. &amp;lt;br&amp;gt;&lt;br /&gt;
De asemenea, observăm că variabila numar_1 este asociată cu două referințe.&lt;br /&gt;
&lt;br /&gt;
O referință nu poate fi asociată cu o valoare. Următorul program va genera erori de compilare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int&amp;amp; rNumar = 20; // aceasta expresie nu este permisa&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pasarea argumentelor prin referință === &lt;br /&gt;
&lt;br /&gt;
Utilitatea referințelor este evidențiată atunci când avem nevoie sa accesăm o variabilă din contexte diferite (precum două metode diferite). Folosind referințe putem economisi memorie, folosind același spațiu de memorie accesat cu două nume de variabile diferite. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Următorul exemplu &amp;#039;&amp;#039;&amp;#039;nu&amp;#039;&amp;#039;&amp;#039; folosește referințe pentru pasarea argumentelor (&amp;#039;&amp;#039;&amp;#039;pass-by-value&amp;#039;&amp;#039;&amp;#039;). &amp;lt;br&amp;gt;&lt;br /&gt;
În acest caz, de fiecare dată când funcția sum este apelată, în memorie este alocat spațiu pentru două variabile noi ce iau valorile argumentelor. Acest lucru nu este eficient atunci când avem nevoie sa pasăm informații de dimensiuni mari.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
*&lt;br /&gt;
* Exemplu pass-by-value&lt;br /&gt;
*&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;
int sum(int a, int b){&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 5;&lt;br /&gt;
    int b = 6;&lt;br /&gt;
    int suma = sum(a, b);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Suma: &amp;quot; &amp;lt;&amp;lt; suma &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7244</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7244"/>
		<updated>2022-03-29T18:38:04Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
=== Asocierea referințelor ===&lt;br /&gt;
&lt;br /&gt;
Asocierea între o referință și o variabilă este permanentă și nu putem asocia referința cu altă variabilă! Putem, în schimb, să asociem mai multe referințe cu aceeași variabilă. &amp;lt;br&amp;gt;&lt;br /&gt;
Observați datele de ieșire ale următorului exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar_1 = 25;&lt;br /&gt;
    int numar_2 = 30;&lt;br /&gt;
&lt;br /&gt;
    int&amp;amp; r1Numar = numar_1;&lt;br /&gt;
    int&amp;amp; r2Numar = numar_1;&lt;br /&gt;
&lt;br /&gt;
    r1Numar = numar_2;&lt;br /&gt;
    r1Numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r1Numar:  &amp;quot; &amp;lt;&amp;lt; r1Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui r2Numar:  &amp;quot; &amp;lt;&amp;lt; r2Numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_1:  &amp;quot; &amp;lt;&amp;lt; numar_1 &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Valoarea lui numar_2:  &amp;quot; &amp;lt;&amp;lt; numar_2 &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Valoarea lui r1Numar:  31&lt;br /&gt;
Valoarea lui r2Numar:  31&lt;br /&gt;
Valoarea lui numar_1:  31&lt;br /&gt;
Valoarea lui numar_2:  30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că expresia &amp;lt;code&amp;gt;r1Numar= numar_2;&amp;lt;/code&amp;gt; nu a asociat referința r1Numarcu variabila numar_2, ci a determinat copierea valorii numar_2 în variabila cu care rNumar este asociată. &amp;lt;br&amp;gt;&lt;br /&gt;
De asemenea, observăm că variabila numar_1 este asociată cu două referințe.&lt;br /&gt;
&lt;br /&gt;
O referință nu poate fi asociată cu o valoare. Următorul program va genera erori de compilare:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int&amp;amp; rNumar = 20; // aceasta expresie nu este permisa&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7243</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7243"/>
		<updated>2022-03-29T18:20:39Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
=== Exemplu ===&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
=== Introducere ===&lt;br /&gt;
&lt;br /&gt;
O referință reprezintă un nume alternativ cu care poate fi accesat un obiect/o variabilă. Așa cum vom prezenta în continuare, mecanismul de referințe simplifică accesul la date intre diferite entități (de exemplu între funcții). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru declararea unei referințe este următoarea: &amp;lt;code&amp;gt; &amp;lt;tip_de_date&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;&amp;#039; nume_referinta = variabila &amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Odată declarată, cu ajutorul referinței vom accesa aceeași informație pe care o accesăm cu variabila cu care aceasta a fost legată (cele două făcând referire la aceeași zonă de memorie).&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int numar = 25;&lt;br /&gt;
&lt;br /&gt;
    // rNumar va fi o referinta (alt nume) a variabilei numar&lt;br /&gt;
    int&amp;amp; rNumar = numar;&lt;br /&gt;
&lt;br /&gt;
    // observam ca au aceeasi valoare&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  initial: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar initial: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    rNumar++;&lt;br /&gt;
    numar++;&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Numar  final: &amp;quot; &amp;lt;&amp;lt; numar  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;rNumar final: &amp;quot; &amp;lt;&amp;lt; rNumar &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Numar  initial: 25&lt;br /&gt;
rNumar initial: 25&lt;br /&gt;
&lt;br /&gt;
Numar  final: 27&lt;br /&gt;
rNumar final: 27&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În exemplul anterior se observă că deși folosim două variabile diferite, valorile celor doua sunt întotdeauna identice, iar o modificare asupra uneia se reflectă și asupra celeilalte.&lt;br /&gt;
&lt;br /&gt;
=== Asocierea referințelor ===&lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7234</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7234"/>
		<updated>2022-03-28T20:15:39Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducere =&lt;br /&gt;
&lt;br /&gt;
Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7233</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7233"/>
		<updated>2022-03-28T20:14:51Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7232</id>
		<title>C++ POO Lab Lucrarea 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_3&amp;diff=7232"/>
		<updated>2022-03-28T20:09:19Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: Pagină nouă: Această lucrare are ca scop familiarizarea cu următoarele noțiuni: * Destructorul * Referința * Supraîncărcarea operatorilor   = Destructorul =  Așa cum s-a prezentat în la...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Această lucrare are ca scop familiarizarea cu următoarele noțiuni:&lt;br /&gt;
* Destructorul&lt;br /&gt;
* Referința&lt;br /&gt;
* Supraîncărcarea operatorilor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Destructorul =&lt;br /&gt;
&lt;br /&gt;
Așa cum s-a prezentat în laboratorul anterior, crearea unui obiect se face folosind o metodă specială, numită &amp;#039;&amp;#039;&amp;#039;constructor&amp;#039;&amp;#039;&amp;#039;. Printre altele, cu ajutorul constructorului putem: &lt;br /&gt;
* Inițializa câmpurile obiectului pe care îl construim&lt;br /&gt;
* Condiționa valorile cu care inițializăm câmpurile (de exemplu vârsta unei persoane nu poate avea valoare negativa)&lt;br /&gt;
* Aloca memorie în mod dinamic&lt;br /&gt;
&lt;br /&gt;
Pe de altă parte, odată ce nu mai avem nevoie de un obiect, acesta trebuie eliminat într-un mod controlat, astfel încât memoria ocupată să poată fi refolosită. Acest lucru este realizat cu ajutorul unei alte metode speciale, numită &amp;#039;&amp;#039;&amp;#039;destructor&amp;#039;&amp;#039;&amp;#039;, ce este apelată automat atunci când contextul în care a fost declarat obiectul se încheie (out of scope). Pentru mai multe informații legate de context (scope) în C++, accesați [https://en.cppreference.com/w/cpp/language/scope acest link].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
În exemplul de mai jos sunt evidențiate mecanismele de ’construire’ si ’distrugere’ a obiectelor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// clasa Array modeleaza un array alocat dinamic&lt;br /&gt;
class Array{&lt;br /&gt;
public:&lt;br /&gt;
    int *arr;&lt;br /&gt;
&lt;br /&gt;
    // constructorul aloca memorie si stocheaza adresa primului element in *arr&lt;br /&gt;
    Array(int dimensiune){&lt;br /&gt;
        arr = (int*) malloc(dimensiune * sizeof(int));&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din constructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // destructorul se asigura ca memoria alocata este eliberata atunci cand obiectul este distrus&lt;br /&gt;
    ~Array(){&lt;br /&gt;
        free(arr);&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Acest mesaj provine din destructor&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Array array(4);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Obiectul a fost construit!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dacă executăm acest program obținem următorul output:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
Acest mesaj provine din constructor&lt;br /&gt;
Obiectul a fost construit!&lt;br /&gt;
Acest mesaj provine din destructor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observăm că, odată ce contextul în care a fost declarat obiectul (contextul este, aici, funcția main), destructorul acestui obiect a fost apelat automat si a fost generat mesajul corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Referința = &lt;br /&gt;
&lt;br /&gt;
= Supraîncărcarea operatorilor =&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_1&amp;diff=6693</id>
		<title>C++ POO Lab Lucrarea 1</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_1&amp;diff=6693"/>
		<updated>2020-09-20T09:09:10Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În acest laborator ne vom reaminti sintaxa limbajului C, vom exersa utilizarea mediului de dezvoltare CLion și a &amp;#039;&amp;#039;debugger&amp;#039;&amp;#039;-ului.&lt;br /&gt;
&lt;br /&gt;
== Tool-ul de depanare GDB ==&lt;br /&gt;
Depanatorul GNU, cunoscut drept GDB (GNU debugger), este depanatorul standard pentru sistemul de software GNU.&amp;lt;br&amp;gt;&lt;br /&gt;
Scopul unui depanator precum GDB este de a permite utilizatorului să vadă ce se întâmplă în interiorul unui alt program în timp ce acesta se execută (pentru a determina motivul rezultatelor necorespunzătoare) sau ce s-a întâmplat cu programul în momentul în care a fost întreruptă execuţia în mod neaşteptat.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDB este capabil de a îndeplini 4 categorii de operații (și alte operaţii intermediare lor):&lt;br /&gt;
* să pornească programul, specificând orice ar putea interveni în buna funcționare a acestuia;&lt;br /&gt;
* să determine o pauză in execuţia programului în anumite condiții specificate de utilizator;&lt;br /&gt;
* să examineze ce s-a întâmplat în momentul opririi programului;&lt;br /&gt;
* să modifice anumite valori în program pentru a putea corecta efectele unui bug și a investiga urmările altuia.&amp;lt;br&amp;gt;&lt;br /&gt;
Odată pornit, GDB citește comenzi din terminal până la întâlnirea comenzii de ieșire &amp;quot;quit&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pentru a putea folosi debugger-ul, la generarea fișierului executabil trebuie folosită opțiunea &amp;#039;&amp;#039;&amp;#039;-g&amp;#039;&amp;#039;&amp;#039;, care adaugă simboluri de debug în executabil, fără de care depanarea nu este posibilă. (vezi [http://wiki.dcae.pub.ro/index.php/PC_Laborator_1 Laboratorul 1])&amp;lt;/div&amp;gt;&lt;br /&gt;
Exemplul unei comenzi de compilare în vederea depanării:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g hello.c -o hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Comenzi specifice GDB ===&lt;br /&gt;
Cea mai folosită modalitate de a porni tool-ul de depanare este de a scrie &amp;#039;&amp;#039;&amp;#039;gdb&amp;#039;&amp;#039;&amp;#039; în terminal, urmat de numele executabilului ce se dorește a fi depanat.&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
O parte din comenzile cele mai utilizate ale GDB sunt următoarele (pentru lista completă studiați pagina de manual GDB - man gdb):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opțiune !! Efect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție &amp;lt;br&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] număr_linie || Setează un breakpoint (punct de întrerupere) la începutul funcției &amp;#039;&amp;#039;nume_funcție&amp;#039;&amp;#039; sau la linia specificată prin &amp;#039;&amp;#039;număr_linie&amp;#039;&amp;#039; din fișierul specificat prin &amp;#039;&amp;#039;nume_fișier&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;run&amp;lt;/code&amp;gt; [listă_argumente] || Pornește programul în execuție (cu lista de argumente, dacă au fost specificate).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;bt&amp;lt;/code&amp;gt; || Backtrace: afișează stiva de program.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;print&amp;lt;/code&amp;gt; expresie || Afișează valoarea unei expresii (valoarea stocată într-o variabilă, valoarea returnată de o funcție etc.).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;c&amp;lt;/code&amp;gt; || Continuă execuția programului (după ce a fost oprit, spre exemplu după un breakpoint).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;next&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), sărind peste orice apel de funcție care se găsește în această linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;list&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție || Afișează liniile de cod ale programului din vecinătatea locului unde este oprit acum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;step&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), intrând în orice funcție apelată de acea linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;help&amp;lt;/code&amp;gt; [nume] || Afișează informații despre comanda GDB &amp;#039;&amp;#039;nume&amp;#039;&amp;#039; sau informații generale despre utilizarea GDB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;quit&amp;lt;/code&amp;gt; || Iese din GDB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Cele mai multe dintre aceste comenzi pot fi apelate doar prin prima literă a numelui lor. &amp;lt;/div&amp;gt;&lt;br /&gt;
Spre exemplu, următoarea comandă:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
este identică cu:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Dacă se apasă pe enter fără a scrie o comandă, se repetă ultima comandă specificată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu de depanare ===&lt;br /&gt;
Se dă fișierul sursă &amp;#039;&amp;#039;suma_fact.c&amp;#039;&amp;#039;, care conține următoarele instrucțiuni:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsigned int factorial(int n) {&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int i;&lt;br /&gt;
    unsigned int fact = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= n; i++){&lt;br /&gt;
        fact *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return fact;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, i;&lt;br /&gt;
    do {&lt;br /&gt;
        printf(&amp;quot;Introduceti un numar natural mai mic sau egal cu 8: &amp;quot;);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    } while (n &amp;lt; 0 || n &amp;gt; 8);&lt;br /&gt;
    unsigned int suma = 0;&lt;br /&gt;
    for (i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        suma += factorial(i);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;%u\n&amp;quot;, suma);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Programul își propune să calculeze suma factorialelor de la 0 la n, unde n este introdus de la tastatură. Dacă rulăm programul vom obține ca rezultat numărul &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, indiferent de ce a fost introdus de la tastatură. Ne propunem să descoperim bug-ul folosind GDB.&amp;lt;br&amp;gt;&lt;br /&gt;
Compilăm sursa, adăugând simboluri de debug în executabil, după care lansăm în execuție debugger-ul:&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g suma_fact.c -o suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Comanda de mai sus lansează în execuție numai debugger-ul, nu și programul &amp;#039;&amp;#039;suma_fact&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Putem observa că am pornit debugger-ul prin faptul că fiecare rând nou din linia de comandă începe acum astfel:&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Punem un &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; la linia 20, unde se citește valoarea lui n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) b 20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1 at 0x80484c2: file suma_fact.c, line 20.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pornim programul în interiorul debugger-ului:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) run&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Starting program: /home/student/Desktop/suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1, main () at suma_fact.c:20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;20          scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Trecem mai departe și introducem o valoare pentru n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Introduceti un numar natural mai mic sau egal cu 8: 6 &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;21      }while(n&amp;lt;0 || n&amp;gt;8);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Vom parcurge programul pas cu pas până la apelarea funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;22      unsigned int suma = 0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23      for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24          suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=0) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4     if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;5         return 1;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;13  }&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;main () at suma_fact.c:23&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23      for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24          suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=1) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4     if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;8     unsigned int fact=0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9     for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;10          fact *= i;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9     for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;12      return fact;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) print fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;$1 = 0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Observăm că valoarea returnată de funcția &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; pentru orice număr nenul este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;. Acest lucru se datorează inițializării variabilei &amp;#039;&amp;#039;fact&amp;#039;&amp;#039; cu valoarea &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; la începutul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;. Putem ieși din debugger pentru a modifica linia 8 din fișierul sursă suma_fact.c:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) q&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;A debugging session is active.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;    Inferior 1 [process 4279] will be killed.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Quit anyway? (y or n) y &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Pentru a putea intra în interiorul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; este absolut necesar să se folosească comanda &amp;#039;&amp;#039;&amp;#039;step&amp;#039;&amp;#039;&amp;#039; și nu comanda &amp;#039;&amp;#039;&amp;#039;next&amp;#039;&amp;#039;&amp;#039; care ar trece peste acea linie 24 fără a intra în corpul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După acest laborator veți putea folosi IDE-ul CLion pentru a scrie și depana programe în C. Totodată veți relua și recapitula noțiunile legate de pointeri în C.&lt;br /&gt;
&lt;br /&gt;
= Utilizarea IDE-ului CLion =&lt;br /&gt;
&lt;br /&gt;
[https://www.jetbrains.com/clion CLion] este un mediu integrat de dezvoltare (IDE) care permite dezvoltarea de programe în limbajele C și C++. CLion nu instalează și compilator pentru C/C++, acesta trebuie instalat manual, în prealabil. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Imaginea de Linux folosită la Programarea Calculatoarelor are deja instalat compilatorul de C.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalarea GCC ==&lt;br /&gt;
&lt;br /&gt;
=== Instalarea GCC în Linux ===&lt;br /&gt;
&lt;br /&gt;
Pentru instalarea compilatorului de C (GCC) în distribuțiile de Linux provenite din Ubuntu (Ubuntu, Kubuntu, Xubuntu, Mint, LMDE, etc.) se poate folosi comanda:&lt;br /&gt;
&lt;br /&gt;
 apt-get install -y build-essential&lt;br /&gt;
&lt;br /&gt;
=== Instalarea GCC în Windows ===&lt;br /&gt;
&lt;br /&gt;
Pentru compilarea de programe cu GCC în Windows, aveți nevoie de instalarea acestui compilator care poate fi făcută prin instalarea unuia din următoarele două suite de programe:&lt;br /&gt;
* [https://cygwin.com Cygwin] - Tutorial de instalare [https://cygwin.com/install.html aici].&lt;br /&gt;
* [http://www.mingw.org/ MinGW] - Tutorial de instalare [http://www.mingw.org/wiki/InstallationHOWTOforMinGW aici].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Nu uitați ca la instalare să bifați în lista de pachete și compilatorul de C (&amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalarea CLion ==&lt;br /&gt;
&lt;br /&gt;
De la adresa https://www.jetbrains.com/clion/download/#section=linux puteți descărca kitul de instalare pentru sistemul vostru de operare.&lt;br /&gt;
După instalare, urmaţi următorii paşi de configurare, în funcţie de suita de programe aleasă:&lt;br /&gt;
* [https://www.jetbrains.com/help/clion/quick-tutorial-on-configuring-clion-on-windows.html#Cygwin Configurare CLion cu Cygwin]&lt;br /&gt;
* [https://www.jetbrains.com/help/clion/quick-tutorial-on-configuring-clion-on-windows.html#MinGW  Configurare CLion cu MinGW]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Realizarea unui proiect ==&lt;br /&gt;
&lt;br /&gt;
Odată pornit, CLion oferă posibilitatea de a deschide un proiect existent, sau de a crea unul nou. Vrem să realizăm un proiect nou, aşadar se va alege &amp;#039;&amp;#039;&amp;#039;New Project&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Se poate realiza un nou proiect atunci când altul este deja deschis folosind meniul &amp;lt;code&amp;gt;File - New Project &amp;lt;/code&amp;gt; .&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Welcome_to_clion.png | 600px | Imaginea 1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Mai departe se va selecta categoria &amp;#039;&amp;#039;&amp;#039;C++ Executable&amp;#039;&amp;#039;&amp;#039; şi se va introduce locaţia proiectului.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; În imagine se observă că locaţia introdusă este &amp;#039;&amp;#039;&amp;#039;/home/student/projects/NewProject&amp;#039;&amp;#039;&amp;#039;. Se recomandă ca directorul în care se realizează proiectul să aibă numele proiectului, sau un nume sugestiv (în imagine &amp;#039;&amp;#039;&amp;#039;NewProject&amp;#039;&amp;#039;&amp;#039;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:New_project_location_clion.png | 600px | Imaginea 2]]&lt;br /&gt;
&lt;br /&gt;
== Componentele IDE-ului CLion == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:CLion_env.png | 1000px | Imaginea 3]]&lt;br /&gt;
&lt;br /&gt;
La crearea unui nou proiect, IDE-ul CLion generează automat fişierul &amp;#039;&amp;#039;&amp;#039;main.cpp&amp;#039;&amp;#039;&amp;#039;. Acesta conţine un exemplu program ce va fi rescris de către utilizator. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Secţiunile marcate în imagine reprezintă:&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;verde&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Project view&amp;#039;&amp;#039;&amp;#039; indică toate fişierele şi directoarele ce alcătuiesc proiectul.&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;albastră&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Editor&amp;#039;&amp;#039;&amp;#039; este fereastra de vizualizare şi editare a textului &lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;roşie&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; oferă acces rapid pentru operaţiile uzuale. Dintre acestea, cel mai des vom folosi:&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Build&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_build_button.png | 16px]]&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Run&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_run_button.png | 16px]]&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Debug&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_debug_button.png | 16px]]&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: gold&amp;quot;&amp;gt;galbenă&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Run&amp;#039;&amp;#039;&amp;#039; este zona în care se introduc datele de intrare şi se în care vor fi afişate datele de ieşire.&lt;br /&gt;
&lt;br /&gt;
== Exemplu de program în modul &amp;#039;&amp;#039;debug&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
Copiați codul de mai jos înlocuind programul deja existent în fișierul &amp;#039;&amp;#039;main.c&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    printf(&amp;quot;Debugging program...\n&amp;quot;);&lt;br /&gt;
    int value = 0;&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    value++;&lt;br /&gt;
    value = value * 2;&lt;br /&gt;
    value -= 1;&lt;br /&gt;
    printf(&amp;quot;Value is now %d!\n&amp;quot;, value);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a executa programul în modul debug trebuie sa introducem cel puţin un &amp;#039;&amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039;&amp;#039;. Astfel indicăm programului unde se va opri pentru a ne acorda control asupra execuţiei, având posibilitatea de a continua execuţia pas cu pas. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Introducem un nou breakpoint dând click în dreptul liniei de la care vrem să obţinem controlul. În cazul nostru, vom alege să indroducem un breakpoint chiar la definirea variabilei &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:CLion_breakpoint.png | 1000px | Imaginea 4]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Când alegem locaţia unui breakpoint trebuie să ţinem cont de următorul aspect: în modul &amp;#039;&amp;#039;&amp;#039;debug&amp;#039;&amp;#039;&amp;#039; programul se va opri &amp;#039;&amp;#039;&amp;#039;înainte&amp;#039;&amp;#039;&amp;#039; de a executa linia în dreptul căreia a fost introdus breakpoint-ul!&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În continuare, trebuie se pornim execuţia programului in modul debug [[Fișier:CLion_debug_button.png | 16px]]. Observăm apariţia ferestrei Debug (chenarul albastru, Imaginea 5) ce conţine următoarele:&lt;br /&gt;
#Zona &amp;lt;span style=&amp;quot;color: gold&amp;quot;&amp;gt;galbenă&amp;lt;/span&amp;gt; - fereastra cu toate variabilele declarate, împreună cu valorile lor. Momentan nu există nicio variabilă declarată (deoarece linia asupra la care ne-am oprit nu a fost încă executată!)&lt;br /&gt;
#Zona &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;roşie&amp;lt;/span&amp;gt; - Permite trecerea între fereastra pentru procesul de depanare (&amp;#039;&amp;#039;&amp;#039;Debugger&amp;#039;&amp;#039;&amp;#039;) şi fereastra în care se afişează/introduc datele (&amp;#039;&amp;#039;&amp;#039;Console&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
#Zona &amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;verde&amp;lt;/span&amp;gt; - Conţine comenzile pentru controlul execuţiei în modul debug (comenzi numite &amp;#039;&amp;#039;&amp;#039;stepping actions&amp;#039;&amp;#039;&amp;#039;):&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Step over&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_step_over.png | 16px]] - Execută comenzile de pe linia curentă şi trece la următoarea linie&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Step into&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_step_into.png | 16px]] - Programul va executa linia curentă iar dacă pe linia curentă există un apel de funcție, se va opri pe prima linie din funcția respectivă. Această comandă este utilă atunci cand pe linia curentă se află un apel de funcţie şi vrem sa studiem comportamentul codului din interiorul funcţiei.&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Step out&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_step_out.png | 16px]] - Termină de executat funcţia în care se află linia curentă&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Run to cursor&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_run_to_cursor.png | 16px]] - Execută toate instructiunile până se intâlneste cursorul.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; În modul debug, linia curentă este marcată de către mediul de dezvoltare prin colorarea acesteia cu albastru.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alte comenzi utile:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Resume program&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_resume_project.png | 16px]] - Continuă execuţia pâmă la următorul breakpoint (dacă nu există, se va executa până la final)&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Stop&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_stop.png | 16px]] - Se opreşte definitv execuţia programului, împreună cu modul debug&lt;br /&gt;
&lt;br /&gt;
[[Fișier:CLion_debug_process.png | 1000px | Imaginea 5]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a exersa utilizarea sistemului de debug, realizați următoarele operații:&lt;br /&gt;
# Parcurgeti tot programul folosind &amp;#039;&amp;#039;&amp;#039;Step Over&amp;#039;&amp;#039;&amp;#039; și vizualizând valoarea variabilei &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; la fiecare pas, până la ultima linie din program, unde utilizați &amp;#039;&amp;#039;&amp;#039;Resume program&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Reporniți aplicația în modul de debug și puneți un al doilea &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; pe linia cu apelul funcției &amp;lt;code&amp;gt;printf&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Folosiți &amp;#039;&amp;#039;&amp;#039;Resume program&amp;#039;&amp;#039;&amp;#039; pentru a ajunge la al doilea &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039;.&lt;br /&gt;
# Odată ajunși acolo, folosiți &amp;#039;&amp;#039;&amp;#039;Step In&amp;#039;&amp;#039;&amp;#039; pentru a intra în funcția &amp;lt;code&amp;gt;printf&amp;lt;/code&amp;gt; (neavând codul sursă, veți vedea codul de asamblare obținut din dezasamblarea fișierului obiect de către GDB).&lt;br /&gt;
# Folosiți &amp;#039;&amp;#039;&amp;#039;Step Out&amp;#039;&amp;#039;&amp;#039; pentru a reveni în funcția &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; și apoi &amp;#039;&amp;#039;&amp;#039;Resume program&amp;#039;&amp;#039;&amp;#039; pentru a termina execuția.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tips &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Formatare automată a codului ===&lt;br /&gt;
&lt;br /&gt;
CLion oferă opțiunea de a formata automat codul prin selectarea &amp;#039;&amp;#039;&amp;#039;Code -&amp;gt; Reformat Code&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Ce probleme rezolvă această formatare automată:&lt;br /&gt;
* alinierea liniilor în funcție de blocurile de instrucțiuni și tipurile de &amp;#039;&amp;#039;statements&amp;#039;&amp;#039; de pe fiecare linie;&lt;br /&gt;
* plasarea sau eliminarea de spații acolo unde este necasar.&lt;br /&gt;
Ce probleme NU rezolvă această formatare automată;&lt;br /&gt;
* lipsa acoladelor de la blocurile &amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* numele insuficient de sugestive pentru numele de funcții, structuri sau variabile.&lt;br /&gt;
&lt;br /&gt;
Stilul conform căruia este modificat codul poate fi configurat folosind meniul &amp;lt;code&amp;gt;File|Settings|Editor|CodeStyle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generare automată a codului ===&lt;br /&gt;
&lt;br /&gt;
CLion oferă posibilitatea de a genera fragmente de cod des înâlnite, precum constructori şi operatori în interiorul claselor. Această acţiune poate fi realizată folosind meniul &amp;lt;code&amp;gt; Code|Generate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Altele ===&lt;br /&gt;
* [https://www.jetbrains.com/help/clion/using-todo.html TODO Comments]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Nu uitați de regulile următoare: [[Convenții de cod - C]]&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_1&amp;diff=6692</id>
		<title>C++ POO Lab Lucrarea 1</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_1&amp;diff=6692"/>
		<updated>2020-09-19T14:30:31Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: CLion debugger&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În acest laborator ne vom reaminti sintaxa limbajului C, vom exersa utilizarea mediului de dezvoltare CLion și a &amp;#039;&amp;#039;debugger&amp;#039;&amp;#039;-ului.&lt;br /&gt;
&lt;br /&gt;
== Tool-ul de depanare GDB ==&lt;br /&gt;
Depanatorul GNU, cunoscut drept GDB (GNU debugger), este depanatorul standard pentru sistemul de software GNU.&amp;lt;br&amp;gt;&lt;br /&gt;
Scopul unui depanator precum GDB este de a permite utilizatorului să vadă ce se întâmplă în interiorul unui alt program în timp ce acesta se execută (pentru a determina motivul rezultatelor necorespunzătoare) sau ce s-a întâmplat cu programul în momentul în care a fost întreruptă execuţia în mod neaşteptat.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDB este capabil de a îndeplini 4 categorii de operații (și alte operaţii intermediare lor):&lt;br /&gt;
* să pornească programul, specificând orice ar putea interveni în buna funcționare a acestuia;&lt;br /&gt;
* să determine o pauză in execuţia programului în anumite condiții specificate de utilizator;&lt;br /&gt;
* să examineze ce s-a întâmplat în momentul opririi programului;&lt;br /&gt;
* să modifice anumite valori în program pentru a putea corecta efectele unui bug și a investiga urmările altuia.&amp;lt;br&amp;gt;&lt;br /&gt;
Odată pornit, GDB citește comenzi din terminal până la întâlnirea comenzii de ieșire &amp;quot;quit&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pentru a putea folosi debugger-ul, la generarea fișierului executabil trebuie folosită opțiunea &amp;#039;&amp;#039;&amp;#039;-g&amp;#039;&amp;#039;&amp;#039;, care adaugă simboluri de debug în executabil, fără de care depanarea nu este posibilă. (vezi [http://wiki.dcae.pub.ro/index.php/PC_Laborator_1 Laboratorul 1])&amp;lt;/div&amp;gt;&lt;br /&gt;
Exemplul unei comenzi de compilare în vederea depanării:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g hello.c -o hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Comenzi specifice GDB ===&lt;br /&gt;
Cea mai folosită modalitate de a porni tool-ul de depanare este de a scrie &amp;#039;&amp;#039;&amp;#039;gdb&amp;#039;&amp;#039;&amp;#039; în terminal, urmat de numele executabilului ce se dorește a fi depanat.&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
O parte din comenzile cele mai utilizate ale GDB sunt următoarele (pentru lista completă studiați pagina de manual GDB - man gdb):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opțiune !! Efect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție &amp;lt;br&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] număr_linie || Setează un breakpoint (punct de întrerupere) la începutul funcției &amp;#039;&amp;#039;nume_funcție&amp;#039;&amp;#039; sau la linia specificată prin &amp;#039;&amp;#039;număr_linie&amp;#039;&amp;#039; din fișierul specificat prin &amp;#039;&amp;#039;nume_fișier&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;run&amp;lt;/code&amp;gt; [listă_argumente] || Pornește programul în execuție (cu lista de argumente, dacă au fost specificate).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;bt&amp;lt;/code&amp;gt; || Backtrace: afișează stiva de program.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;print&amp;lt;/code&amp;gt; expresie || Afișează valoarea unei expresii (valoarea stocată într-o variabilă, valoarea returnată de o funcție etc.).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;c&amp;lt;/code&amp;gt; || Continuă execuția programului (după ce a fost oprit, spre exemplu după un breakpoint).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;next&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), sărind peste orice apel de funcție care se găsește în această linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;list&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție || Afișează liniile de cod ale programului din vecinătatea locului unde este oprit acum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;step&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), intrând în orice funcție apelată de acea linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;help&amp;lt;/code&amp;gt; [nume] || Afișează informații despre comanda GDB &amp;#039;&amp;#039;nume&amp;#039;&amp;#039; sau informații generale despre utilizarea GDB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;quit&amp;lt;/code&amp;gt; || Iese din GDB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Cele mai multe dintre aceste comenzi pot fi apelate doar prin prima literă a numelui lor. &amp;lt;/div&amp;gt;&lt;br /&gt;
Spre exemplu, următoarea comandă:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
este identică cu:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Dacă se apasă pe enter fără a scrie o comandă, se repetă ultima comandă specificată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu de depanare ===&lt;br /&gt;
Se dă fișierul sursă &amp;#039;&amp;#039;suma_fact.c&amp;#039;&amp;#039;, care conține următoarele instrucțiuni:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsigned int factorial(int n) {&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int i;&lt;br /&gt;
    unsigned int fact = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= n; i++){&lt;br /&gt;
        fact *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return fact;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, i;&lt;br /&gt;
    do {&lt;br /&gt;
        printf(&amp;quot;Introduceti un numar natural mai mic sau egal cu 8: &amp;quot;);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    } while (n &amp;lt; 0 || n &amp;gt; 8);&lt;br /&gt;
    unsigned int suma = 0;&lt;br /&gt;
    for (i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        suma += factorial(i);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;%u\n&amp;quot;, suma);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Programul își propune să calculeze suma factorialelor de la 0 la n, unde n este introdus de la tastatură. Dacă rulăm programul vom obține ca rezultat numărul &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, indiferent de ce a fost introdus de la tastatură. Ne propunem să descoperim bug-ul folosind GDB.&amp;lt;br&amp;gt;&lt;br /&gt;
Compilăm sursa, adăugând simboluri de debug în executabil, după care lansăm în execuție debugger-ul:&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g suma_fact.c -o suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Comanda de mai sus lansează în execuție numai debugger-ul, nu și programul &amp;#039;&amp;#039;suma_fact&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Putem observa că am pornit debugger-ul prin faptul că fiecare rând nou din linia de comandă începe acum astfel:&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Punem un &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; la linia 20, unde se citește valoarea lui n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) b 20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1 at 0x80484c2: file suma_fact.c, line 20.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pornim programul în interiorul debugger-ului:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) run&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Starting program: /home/student/Desktop/suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1, main () at suma_fact.c:20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;20          scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Trecem mai departe și introducem o valoare pentru n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Introduceti un numar natural mai mic sau egal cu 8: 6 &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;21      }while(n&amp;lt;0 || n&amp;gt;8);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Vom parcurge programul pas cu pas până la apelarea funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;22      unsigned int suma = 0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23      for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24          suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=0) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4     if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;5         return 1;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;13  }&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;main () at suma_fact.c:23&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23      for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24          suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=1) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4     if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;8     unsigned int fact=0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9     for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;10          fact *= i;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9     for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;12      return fact;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) print fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;$1 = 0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Observăm că valoarea returnată de funcția &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; pentru orice număr nenul este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;. Acest lucru se datorează inițializării variabilei &amp;#039;&amp;#039;fact&amp;#039;&amp;#039; cu valoarea &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; la începutul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;. Putem ieși din debugger pentru a modifica linia 8 din fișierul sursă suma_fact.c:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) q&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;A debugging session is active.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;    Inferior 1 [process 4279] will be killed.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Quit anyway? (y or n) y &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Pentru a putea intra în interiorul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; este absolut necesar să se folosească comanda &amp;#039;&amp;#039;&amp;#039;step&amp;#039;&amp;#039;&amp;#039; și nu comanda &amp;#039;&amp;#039;&amp;#039;next&amp;#039;&amp;#039;&amp;#039; care ar trece peste acea linie 24 fără a intra în corpul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După acest laborator veți putea folosi IDE-ul CLion pentru a scrie și depana programe în C. Totodată veți relua și recapitula noțiunile legate de pointeri în C.&lt;br /&gt;
&lt;br /&gt;
= Utilizarea IDE-ului CLion =&lt;br /&gt;
&lt;br /&gt;
[https://www.jetbrains.com/clion CLion] este un mediu integrat de dezvoltare (IDE) care permite dezvoltarea de programe în limbajele C și C++. CLion nu instalează și compilator pentru C/C++, acesta trebuie instalat manual, în prealabil. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Imaginea de Linux folosită la Programarea Calculatoarelor are deja instalat compilatorul de C.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalarea GCC ==&lt;br /&gt;
&lt;br /&gt;
=== Instalarea GCC în Linux ===&lt;br /&gt;
&lt;br /&gt;
Pentru instalarea compilatorului de C (GCC) în distribuțiile de Linux provenite din Ubuntu (Ubuntu, Kubuntu, Xubuntu, Mint, LMDE, etc.) se poate folosi comanda:&lt;br /&gt;
&lt;br /&gt;
 apt-get install -y build-essential&lt;br /&gt;
&lt;br /&gt;
=== Instalarea GCC în Windows ===&lt;br /&gt;
&lt;br /&gt;
Pentru compilarea de programe cu GCC în Windows, aveți nevoie de instalarea acestui compilator care poate fi făcută prin instalarea unuia din următoarele două suite de programe:&lt;br /&gt;
* [https://cygwin.com Cygwin] - Tutorial de instalare [https://cygwin.com/install.html aici].&lt;br /&gt;
* [http://www.mingw.org/ MinGW] - Tutorial de instalare [http://www.mingw.org/wiki/InstallationHOWTOforMinGW aici].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Nu uitați ca la instalare să bifați în lista de pachete și compilatorul de C (&amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalarea CLion ==&lt;br /&gt;
&lt;br /&gt;
De la adresa https://www.jetbrains.com/clion/download/#section=linux puteți descărca kitul de instalare pentru sistemul vostru de operare (imaginea de Virtualbox cu Linux folosită la Programarea Calculatoarelor ruelază un Linux pe 32 de biți).&lt;br /&gt;
&lt;br /&gt;
Aveți [https://blog.jetbrains.com/clion/2015/05/debug-clion/ aici] un tutorial pentru modalitatea de utilizarea a IDE-ului pentru depanarea codului.&lt;br /&gt;
&lt;br /&gt;
Nu uitați de regulile următoare: [[Convenții de cod - C]]&lt;br /&gt;
&lt;br /&gt;
== Realizarea unui proiect ==&lt;br /&gt;
&lt;br /&gt;
Odată pornit, CLion oferă posibilitatea de a deschide un proiect existent, sau de a crea unul nou. Vrem să realizăm un proiect nou, aşadar se va alege &amp;#039;&amp;#039;&amp;#039;New Project&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Se poate realiza un nou proiect atunci când altul este deja deschis folosind meniul &amp;lt;code&amp;gt;File - New Project &amp;lt;/code&amp;gt; .&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Welcome_to_clion.png | 600px | Imaginea 1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Mai departe se va selecta categoria &amp;#039;&amp;#039;&amp;#039;C++ Executable&amp;#039;&amp;#039;&amp;#039; şi se va introduce locaţia proiectului.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; În imagine se observă că locaţia introdusă este &amp;#039;&amp;#039;&amp;#039;/home/student/projects/NewProject&amp;#039;&amp;#039;&amp;#039;. Se recomandă ca directorul în care se realizează proiectul să aibă numele proiectului, sau un nume sugestiv (în imagine &amp;#039;&amp;#039;&amp;#039;NewProject&amp;#039;&amp;#039;&amp;#039;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:New_project_location_clion.png | 600px | Imaginea 2]]&lt;br /&gt;
&lt;br /&gt;
== Componentele IDE-ului CLion == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:CLion_env.png | 1000px | Imaginea 3]]&lt;br /&gt;
&lt;br /&gt;
La crearea unui nou proiect, IDE-ul CLion generează automat fişierul &amp;#039;&amp;#039;&amp;#039;main.cpp&amp;#039;&amp;#039;&amp;#039;. Acesta conţine un exemplu program ce va fi rescris de către utilizator. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Secţiunile marcate în imagine reprezintă:&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;verde&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Project view&amp;#039;&amp;#039;&amp;#039; indică toate fişierele şi directoarele ce alcătuiesc proiectul.&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;albastră&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Editor&amp;#039;&amp;#039;&amp;#039; este fereastra de vizualizare şi editare a textului &lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;roşie&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; oferă acces rapid pentru operaţiile uzuale. Dintre acestea, cel mai des vom folosi:&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Build&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_build_button.png | 16px]]&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Run&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_run_button.png | 16px]]&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Debug&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_debug_button.png | 16px]]&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: gold&amp;quot;&amp;gt;galbenă&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Run&amp;#039;&amp;#039;&amp;#039; este zona în care se introduc datele de intrare şi se în care vor fi afişate datele de ieşire.&lt;br /&gt;
&lt;br /&gt;
== Exemplu de program în modul &amp;#039;&amp;#039;debug&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
Copiați codul de mai jos înlocuind programul deja existent în fișierul &amp;#039;&amp;#039;main.c&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    printf(&amp;quot;Debugging program...\n&amp;quot;);&lt;br /&gt;
    int value = 0;&lt;br /&gt;
    value = value + 1;&lt;br /&gt;
    value++;&lt;br /&gt;
    value = value * 2;&lt;br /&gt;
    value -= 1;&lt;br /&gt;
    printf(&amp;quot;Value is now %d!\n&amp;quot;, value);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a executa programul în modul debug trebuie sa introducem cel puţin un &amp;#039;&amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039;&amp;#039;. Astfel indicăm programului unde se va opri pentru a ne acorda control asupra execuţiei, având posibilitatea de a continua execuţia pas cu pas. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Introducem un nou breakpoint dând click în dreptul liniei de la care vrem să obţinem controlul. În cazul nostru, vom alege să indroducem un breakpoint chiar la definirea variabilei &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:CLion_breakpoint.png | 1000px | Imaginea 4]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Când alegem locaţia unui breakpoint trebuie să ţinem cont de următorul aspect: în modul &amp;#039;&amp;#039;&amp;#039;debug&amp;#039;&amp;#039;&amp;#039; programul se va opri &amp;#039;&amp;#039;&amp;#039;înainte&amp;#039;&amp;#039;&amp;#039; de a executa linia în dreptul căreia a fost introdus breakpoint-ul!&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În continuare, trebuie se pornim execuţia programului in modul debug [[Fișier:CLion_debug_button.png | 16px]]. Observăm apariţia ferestrei Debug (chenarul albastru, Imaginea 5) ce conţine următoarele:&lt;br /&gt;
#Zona &amp;lt;span style=&amp;quot;color: gold&amp;quot;&amp;gt;galbenă&amp;lt;/span&amp;gt; - fereastra cu toate variabilele declarate, împreună cu valorile lor. Momentan nu există nicio variabilă declarată (deoarece linia asupra la care ne-am oprit nu a fost încă executată!)&lt;br /&gt;
#Zona &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;roşie&amp;lt;/span&amp;gt; - Permite trecerea între fereastra pentru procesul de depanare (&amp;#039;&amp;#039;&amp;#039;Debugger&amp;#039;&amp;#039;&amp;#039;) şi fereastra în care se afişează/introduc datele (&amp;#039;&amp;#039;&amp;#039;Console&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
#Zona &amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;verde&amp;lt;/span&amp;gt; - Conţine comenzile pentru controlul execuţiei în modul debug (comenzi numite &amp;#039;&amp;#039;&amp;#039;stepping actions&amp;#039;&amp;#039;&amp;#039;):&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Step over&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_step_over.png | 16px]] - Execută comenzile de pe linia curentă şi trece la următoarea linie&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Step into&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_step_into.png | 16px]] - Programul va executa linia curentă iar dacă pe linia curentă există un apel de funcție, se va opri pe prima linie din funcția respectivă. Această comandă este utilă atunci cand pe linia curentă se află un apel de funcţie şi vrem sa studiem comportamentul codului din interiorul funcţiei.&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Step out&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_step_out.png | 16px]] - Termină de executat funcţia în care se află linia curentă&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Run to cursor&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_run_to_cursor.png | 16px]] - Execută toate instructiunile până se intâlneste cursorul.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; În modul debug, linia curentă este marcată de către mediul de dezvoltare prin colorarea acesteia cu albastru.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alte comenzi utile:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Resume program&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_resume_project.png | 16px]] - Continuă execuţia pâmă la următorul breakpoint (dacă nu există, se va executa până la final)&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Stop&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_stop.png | 16px]] - Se opreşte definitv execuţia programului, împreună cu modul debug&lt;br /&gt;
&lt;br /&gt;
[[Fișier:CLion_debug_process.png | 1000px | Imaginea 5]]&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_stop.png&amp;diff=6691</id>
		<title>Fișier:CLion stop.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_stop.png&amp;diff=6691"/>
		<updated>2020-09-19T14:16:42Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_resume_project.png&amp;diff=6690</id>
		<title>Fișier:CLion resume project.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_resume_project.png&amp;diff=6690"/>
		<updated>2020-09-19T14:16:29Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_debug_process.png&amp;diff=6689</id>
		<title>Fișier:CLion debug process.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_debug_process.png&amp;diff=6689"/>
		<updated>2020-09-19T13:42:31Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_step_over.png&amp;diff=6688</id>
		<title>Fișier:CLion step over.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_step_over.png&amp;diff=6688"/>
		<updated>2020-09-19T13:38:45Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_step_out.png&amp;diff=6687</id>
		<title>Fișier:CLion step out.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_step_out.png&amp;diff=6687"/>
		<updated>2020-09-19T13:38:38Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_step_into.png&amp;diff=6686</id>
		<title>Fișier:CLion step into.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_step_into.png&amp;diff=6686"/>
		<updated>2020-09-19T13:38:29Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_run_to_cursor.png&amp;diff=6685</id>
		<title>Fișier:CLion run to cursor.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_run_to_cursor.png&amp;diff=6685"/>
		<updated>2020-09-19T13:38:17Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_breakpoint.png&amp;diff=6684</id>
		<title>Fișier:CLion breakpoint.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_breakpoint.png&amp;diff=6684"/>
		<updated>2020-09-19T08:14:45Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_breakpoint.gif&amp;diff=6683</id>
		<title>Fișier:CLion breakpoint.gif</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_breakpoint.gif&amp;diff=6683"/>
		<updated>2020-09-19T08:06:41Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_1&amp;diff=6682</id>
		<title>C++ POO Lab Lucrarea 1</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=C%2B%2B_POO_Lab_Lucrarea_1&amp;diff=6682"/>
		<updated>2020-09-18T20:30:12Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: Intro CLion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În acest laborator ne vom reaminti sintaxa limbajului C, vom exersa utilizarea mediului de dezvoltare CLion și a &amp;#039;&amp;#039;debugger&amp;#039;&amp;#039;-ului.&lt;br /&gt;
&lt;br /&gt;
== Tool-ul de depanare GDB ==&lt;br /&gt;
Depanatorul GNU, cunoscut drept GDB (GNU debugger), este depanatorul standard pentru sistemul de software GNU.&amp;lt;br&amp;gt;&lt;br /&gt;
Scopul unui depanator precum GDB este de a permite utilizatorului să vadă ce se întâmplă în interiorul unui alt program în timp ce acesta se execută (pentru a determina motivul rezultatelor necorespunzătoare) sau ce s-a întâmplat cu programul în momentul în care a fost întreruptă execuţia în mod neaşteptat.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDB este capabil de a îndeplini 4 categorii de operații (și alte operaţii intermediare lor):&lt;br /&gt;
* să pornească programul, specificând orice ar putea interveni în buna funcționare a acestuia;&lt;br /&gt;
* să determine o pauză in execuţia programului în anumite condiții specificate de utilizator;&lt;br /&gt;
* să examineze ce s-a întâmplat în momentul opririi programului;&lt;br /&gt;
* să modifice anumite valori în program pentru a putea corecta efectele unui bug și a investiga urmările altuia.&amp;lt;br&amp;gt;&lt;br /&gt;
Odată pornit, GDB citește comenzi din terminal până la întâlnirea comenzii de ieșire &amp;quot;quit&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pentru a putea folosi debugger-ul, la generarea fișierului executabil trebuie folosită opțiunea &amp;#039;&amp;#039;&amp;#039;-g&amp;#039;&amp;#039;&amp;#039;, care adaugă simboluri de debug în executabil, fără de care depanarea nu este posibilă. (vezi [http://wiki.dcae.pub.ro/index.php/PC_Laborator_1 Laboratorul 1])&amp;lt;/div&amp;gt;&lt;br /&gt;
Exemplul unei comenzi de compilare în vederea depanării:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g hello.c -o hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Comenzi specifice GDB ===&lt;br /&gt;
Cea mai folosită modalitate de a porni tool-ul de depanare este de a scrie &amp;#039;&amp;#039;&amp;#039;gdb&amp;#039;&amp;#039;&amp;#039; în terminal, urmat de numele executabilului ce se dorește a fi depanat.&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb hello&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
O parte din comenzile cele mai utilizate ale GDB sunt următoarele (pentru lista completă studiați pagina de manual GDB - man gdb):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opțiune !! Efect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție &amp;lt;br&amp;gt; &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;break&amp;lt;/code&amp;gt; [nume_fișier:] număr_linie || Setează un breakpoint (punct de întrerupere) la începutul funcției &amp;#039;&amp;#039;nume_funcție&amp;#039;&amp;#039; sau la linia specificată prin &amp;#039;&amp;#039;număr_linie&amp;#039;&amp;#039; din fișierul specificat prin &amp;#039;&amp;#039;nume_fișier&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;run&amp;lt;/code&amp;gt; [listă_argumente] || Pornește programul în execuție (cu lista de argumente, dacă au fost specificate).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;bt&amp;lt;/code&amp;gt; || Backtrace: afișează stiva de program.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;print&amp;lt;/code&amp;gt; expresie || Afișează valoarea unei expresii (valoarea stocată într-o variabilă, valoarea returnată de o funcție etc.).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;c&amp;lt;/code&amp;gt; || Continuă execuția programului (după ce a fost oprit, spre exemplu după un breakpoint).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;next&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), sărind peste orice apel de funcție care se găsește în această linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;list&amp;lt;/code&amp;gt; [nume_fișier:] nume_funcție || Afișează liniile de cod ale programului din vecinătatea locului unde este oprit acum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;step&amp;lt;/code&amp;gt; || Execută următoarea linie de program (după oprire), intrând în orice funcție apelată de acea linie.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;help&amp;lt;/code&amp;gt; [nume] || Afișează informații despre comanda GDB &amp;#039;&amp;#039;nume&amp;#039;&amp;#039; sau informații generale despre utilizarea GDB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code style=&amp;quot;color: green&amp;quot;&amp;gt;quit&amp;lt;/code&amp;gt; || Iese din GDB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Cele mai multe dintre aceste comenzi pot fi apelate doar prin prima literă a numelui lor. &amp;lt;/div&amp;gt;&lt;br /&gt;
Spre exemplu, următoarea comandă:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
este identică cu:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Dacă se apasă pe enter fără a scrie o comandă, se repetă ultima comandă specificată.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemplu de depanare ===&lt;br /&gt;
Se dă fișierul sursă &amp;#039;&amp;#039;suma_fact.c&amp;#039;&amp;#039;, care conține următoarele instrucțiuni:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsigned int factorial(int n) {&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int i;&lt;br /&gt;
    unsigned int fact = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= n; i++){&lt;br /&gt;
        fact *= i;&lt;br /&gt;
    }&lt;br /&gt;
    return fact;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, i;&lt;br /&gt;
    do {&lt;br /&gt;
        printf(&amp;quot;Introduceti un numar natural mai mic sau egal cu 8: &amp;quot;);&lt;br /&gt;
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    } while (n &amp;lt; 0 || n &amp;gt; 8);&lt;br /&gt;
    unsigned int suma = 0;&lt;br /&gt;
    for (i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        suma += factorial(i);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;%u\n&amp;quot;, suma);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Programul își propune să calculeze suma factorialelor de la 0 la n, unde n este introdus de la tastatură. Dacă rulăm programul vom obține ca rezultat numărul &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, indiferent de ce a fost introdus de la tastatură. Ne propunem să descoperim bug-ul folosind GDB.&amp;lt;br&amp;gt;&lt;br /&gt;
Compilăm sursa, adăugând simboluri de debug în executabil, după care lansăm în execuție debugger-ul:&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gcc -g suma_fact.c -o suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt; gdb suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt; Atenție:&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; Comanda de mai sus lansează în execuție numai debugger-ul, nu și programul &amp;#039;&amp;#039;suma_fact&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Putem observa că am pornit debugger-ul prin faptul că fiecare rând nou din linia de comandă începe acum astfel:&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Punem un &amp;#039;&amp;#039;breakpoint&amp;#039;&amp;#039; la linia 20, unde se citește valoarea lui n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) b 20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1 at 0x80484c2: file suma_fact.c, line 20.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pornim programul în interiorul debugger-ului:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) run&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Starting program: /home/student/Desktop/suma_fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Breakpoint 1, main () at suma_fact.c:20&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;20          scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Trecem mai departe și introducem o valoare pentru n:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Introduceti un numar natural mai mic sau egal cu 8: 6 &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;21      }while(n&amp;lt;0 || n&amp;gt;8);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Vom parcurge programul pas cu pas până la apelarea funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;22      unsigned int suma = 0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23      for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24          suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=0) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4     if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;5         return 1;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;13  }&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;main () at suma_fact.c:23&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;23      for(i=0; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;24          suma += factorial(i);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;factorial (n=1) at suma_fact.c:4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;4     if(n==0){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;8     unsigned int fact=0;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9     for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;10          fact *= i;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;9     for(i=1; i&amp;lt;=n; i++){&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) s&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;12      return fact;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) print fact&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;$1 = 0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Observăm că valoarea returnată de funcția &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; pentru orice număr nenul este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;. Acest lucru se datorează inițializării variabilei &amp;#039;&amp;#039;fact&amp;#039;&amp;#039; cu valoarea &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; la începutul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;. Putem ieși din debugger pentru a modifica linia 8 din fișierul sursă suma_fact.c:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;(gdb) q&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;A debugging session is active.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;    Inferior 1 [process 4279] will be killed.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Quit anyway? (y or n) y &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;student@pracsis01&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;~/Desktop $&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Pentru a putea intra în interiorul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039; este absolut necesar să se folosească comanda &amp;#039;&amp;#039;&amp;#039;step&amp;#039;&amp;#039;&amp;#039; și nu comanda &amp;#039;&amp;#039;&amp;#039;next&amp;#039;&amp;#039;&amp;#039; care ar trece peste acea linie 24 fără a intra în corpul funcției &amp;#039;&amp;#039;factorial&amp;#039;&amp;#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După acest laborator veți putea folosi IDE-ul CLion pentru a scrie și depana programe în C. Totodată veți relua și recapitula noțiunile legate de pointeri în C.&lt;br /&gt;
&lt;br /&gt;
= Utilizarea IDE-ului CLion =&lt;br /&gt;
&lt;br /&gt;
[https://www.jetbrains.com/clion CLion] este un mediu integrat de dezvoltare (IDE) care permite dezvoltarea de programe în limbajele C și C++. CLion nu instalează și compilator pentru C/C++, acesta trebuie instalat manual, în prealabil. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Imaginea de Linux folosită la Programarea Calculatoarelor are deja instalat compilatorul de C.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalarea GCC ==&lt;br /&gt;
&lt;br /&gt;
=== Instalarea GCC în Linux ===&lt;br /&gt;
&lt;br /&gt;
Pentru instalarea compilatorului de C (GCC) în distribuțiile de Linux provenite din Ubuntu (Ubuntu, Kubuntu, Xubuntu, Mint, LMDE, etc.) se poate folosi comanda:&lt;br /&gt;
&lt;br /&gt;
 apt-get install -y build-essential&lt;br /&gt;
&lt;br /&gt;
=== Instalarea GCC în Windows ===&lt;br /&gt;
&lt;br /&gt;
Pentru compilarea de programe cu GCC în Windows, aveți nevoie de instalarea acestui compilator care poate fi făcută prin instalarea unuia din următoarele două suite de programe:&lt;br /&gt;
* [https://cygwin.com Cygwin] - Tutorial de instalare [https://cygwin.com/install.html aici].&lt;br /&gt;
* [http://www.mingw.org/ MinGW] - Tutorial de instalare [http://www.mingw.org/wiki/InstallationHOWTOforMinGW aici].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; Nu uitați ca la instalare să bifați în lista de pachete și compilatorul de C (&amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalarea CLion ==&lt;br /&gt;
&lt;br /&gt;
De la adresa https://www.jetbrains.com/clion/download/#section=linux puteți descărca kitul de instalare pentru sistemul vostru de operare (imaginea de Virtualbox cu Linux folosită la Programarea Calculatoarelor ruelază un Linux pe 32 de biți).&lt;br /&gt;
&lt;br /&gt;
Aveți [https://blog.jetbrains.com/clion/2015/05/debug-clion/ aici] un tutorial pentru modalitatea de utilizarea a IDE-ului pentru depanarea codului.&lt;br /&gt;
&lt;br /&gt;
Nu uitați de regulile următoare: [[Convenții de cod - C]]&lt;br /&gt;
&lt;br /&gt;
== Realizarea unui proiect ==&lt;br /&gt;
&lt;br /&gt;
Odată pornit, CLion oferă posibilitatea de a deschide un proiect existent, sau de a crea unul nou. Vrem să realizăm un proiect nou, aşadar se va alege &amp;#039;&amp;#039;&amp;#039;New Project&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039; Observație: &amp;#039;&amp;#039;&amp;#039; Se poate realiza un nou proiect atunci când altul este deja deschis folosind meniul &amp;lt;code&amp;gt;File - New Project &amp;lt;/code&amp;gt; .&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Welcome_to_clion.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Mai departe se va selecta categoria &amp;#039;&amp;#039;&amp;#039;C++ Executable&amp;#039;&amp;#039;&amp;#039; şi se va introduce locaţia proiectului.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: red; font-weight: bold&amp;quot;&amp;gt;Atenție:&amp;lt;/span&amp;gt; În imagine se observă că locaţia introdusă este &amp;#039;&amp;#039;&amp;#039;/home/student/projects/NewProject&amp;#039;&amp;#039;&amp;#039;. Se recomandă ca directorul în care se realizează proiectul să aibă numele proiectului, sau un nume sugestiv (în imagine &amp;#039;&amp;#039;&amp;#039;NewProject&amp;#039;&amp;#039;&amp;#039;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:New_project_location_clion.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
== Componentele IDE-ului CLion == &lt;br /&gt;
&lt;br /&gt;
[[Fișier:CLion_env.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
La crearea unui nou proiect, IDE-ul CLion generează automat fişierul &amp;#039;&amp;#039;&amp;#039;main.cpp&amp;#039;&amp;#039;&amp;#039;. Acesta conţine un exemplu program ce va fi rescris de către utilizator. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Secţiunile marcate în imagine reprezintă:&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;verde&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Project view&amp;#039;&amp;#039;&amp;#039; indică toate fişierele şi directoarele ce alcătuiesc proiectul.&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: blue&amp;quot;&amp;gt;albastră&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Editor&amp;#039;&amp;#039;&amp;#039; este fereastra de vizualizare şi editare a textului &lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;roşie&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; oferă acces rapid pentru operaţiile uzuale. Dintre acestea, cel mai des vom folosi:&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Build&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_build_button.png | 16px]]&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Run&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_run_button.png | 16px]]&lt;br /&gt;
#*&amp;#039;&amp;#039;&amp;#039;Debug&amp;#039;&amp;#039;&amp;#039; [[Fișier:CLion_debug_button.png | 16px]]&lt;br /&gt;
# Zona &amp;lt;span style=&amp;quot;color: gold&amp;quot;&amp;gt;galbenă&amp;lt;/span&amp;gt; - &amp;#039;&amp;#039;&amp;#039;Run&amp;#039;&amp;#039;&amp;#039; este zona în care se introduc datele de intrare şi în care vor fi afişate datele de ieşire.&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_debug_button.png&amp;diff=6681</id>
		<title>Fișier:CLion debug button.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_debug_button.png&amp;diff=6681"/>
		<updated>2020-09-18T19:57:59Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_build_button.png&amp;diff=6680</id>
		<title>Fișier:CLion build button.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_build_button.png&amp;diff=6680"/>
		<updated>2020-09-18T19:56:22Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_run_button.png&amp;diff=6679</id>
		<title>Fișier:CLion run button.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_run_button.png&amp;diff=6679"/>
		<updated>2020-09-18T19:54:43Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_env.png&amp;diff=6678</id>
		<title>Fișier:CLion env.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:CLion_env.png&amp;diff=6678"/>
		<updated>2020-09-18T19:36:29Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:New_project_location_clion.png&amp;diff=6677</id>
		<title>Fișier:New project location clion.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:New_project_location_clion.png&amp;diff=6677"/>
		<updated>2020-09-18T18:57:46Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Welcome_to_clion.png&amp;diff=6676</id>
		<title>Fișier:Welcome to clion.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Welcome_to_clion.png&amp;diff=6676"/>
		<updated>2020-09-18T18:56:51Z</updated>

		<summary type="html">&lt;p&gt;Costin.vasile1003: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Costin.vasile1003</name></author>
	</entry>
</feed>