Sunteți pe pagina 1din 4

POO

LABORATOR 3
Alocarea dinamică a memoriei în C++. Clase și obiecte.

1. Alocarea dinamică a memoriei în C++

În C se pot aloca zone de memorie în memoria heap folosind funcţii de bibliotecă ( malloc(), calloc() ), iar
pentru dealocare se folosește funcția free().
C++ asigură un sistem propriu alternativ de alocare dinamică bazat de 2 operatori: new şi delete.

Utilizarea operatorilor new și delete:


1) tip_data nume_pointer = new tip_data
delete nume_pointer;
Ex: int* pi = new int;
delete pi;
2) tip_data nume_pointer = new tip_data(valoare)
delete nume_pointer;
Ex: float* pf = new float(3.7);
delete pf;
3) tip_data nume_pointer = new tip_data[dimensiune]
delete[] nume_pointer;
Ex: double* pd = new double[5];
delete[] pd;

Operatorul new returnează adresa de început a zonei de memorie alocată, sau pointerul nullptr în cazul în
care nu se poate face alocarea.
O zonă de memorie alocată cu new se eliberează exclusiv prin intermediul operatorului delete; în cazul
eliberării memoriei alocate pentru tablouri sintaxa aferentă este delete [].

Exercițiul 1. Scrieți o funcție numită suma() care va construi un nou vector care să reprezinte suma a doi
vectori cu elemente reale dublă precizie. Funcția are ca parametri: cei doi vectori și dimensiunea acestora și va
returna un pointer la noul vector obținut prin adunarea celor doi vectori transmiși ca parametri.
POO

2. Clase și obiecte

Limbajele orientate obiect permit programarea folosind tipuri abstracte de date, care, în acest context, se
numesc clase.
Crearea unei instanţe a unei clase (instanţierea), cu proprietăţi bine definite, duce la crearea unui obiect.
În concluzie, ideea fundamentală care stă la baza limbajelor orientate obiect este aceea de a combina
(încapsula) într-o singură entitate atât date, numite date membru, cât şi funcţii, numite funcţii membru
(metode), care operează asupra acelor date. O astfel de entitate se numeşte obiect.
Abordarea unei probleme de programare din perspectiva unui limbaj orientat obiect nu mai presupune
împarţirea problemei în funcţii, ci identificarea obiectelor implicate în dezvoltarea soluţiei.
O clasă descrie unul sau mai multe obiecte ce pot fi precizate printr-un acelaşi set de atribute si metode.
Se spune că un obiect este o instanţiere (instanţă) a unei clase.
Un obiect este caracterizat de:
nume
atribute (date) - valorile atributelor la un moment dat definesc o stare
metode (funcţii, operații)
Un obiect se identifică în mod unic prin numele său şi el defineşte o stare reprezentată de atributele sale la un
moment particular de timp.

Declaraţia generică a unei clase poate fi descrisă astfel :


class NumeClasa {
// date membru şi metode (implicit) private
protected:
// date membru şi metode protejate
public:
NumeClasa() ; // prototip constructor implicit
NumeClasa(lista_de_parametri) ; //prototip constructor cu parametri
NumeClasa(const NumeClasa&) ; // prototip constructor de copiere
~NumeClasa() ; // prototip destructor
// date membru şi alte metode publice
};

Controlul accesului la datele și funcțiile membru ale unei clase se face cu ajutorul modificatorilor de acces.
Modificatorul de acces poate fi:
public - se utilizează pentru membrii care dorim să fie neprotejaţi, pot fi accesați de oriunde.
POO

private – datele membru sunt accesibile doar în interiorul clasei și inaccesibile în orice altă zonă din program.
protected - datele sunt accesibile doar in interiorul clasei si in clasele derivate.
Iniţializarea unui obiect este o problemă mult mai complexă decât iniţializarea datelor obişnuite, de aceea se
foloseşte în acest scop o funcţie membru specială, numită constructor.
Constructorul unei clase are întotdeauna acelaşi nume ca şi numele clasei.
Constructorul unei clase nu returnează nici un tip .
Dacă o clasă are definit un constructor atunci acesta se apelează automat la instanţierea unui obiect al clasei
respective, inclusiv în cazul alocării dinamice.
O clasă poate avea mai mulţi constructori care devin astfel metode supraîncarcate.
Constructorii pot avea sau nu parametri.
Eliberarea spaţiului de memorie ocupat de un obiect (distrugerea obiectului) se poate realiza folosind o altă
funcţie membru specială, numită destructor.
Orice clasă are un singur destructor.
Destructorul nu are parametri şi nu returnează nici un tip.
Numele destructorului se construieşte din numele clasei căreia îi aparţine, prefixat de simbolul ~(tilda).
~NumeClasa()
Destructorul este apelat automat de către un program atunci când încetează existenţa unui obiect (la
încheierea execuţiei programului sau atunci când se iese din domeniul de valabilitate al obiectului); în cazul
alocării dinamice, operatorul delete asociat unui pointer ce indică spre o zonă de memorie rezervată pentru un
obiect, apelează implicit destructorul clasei.
În cazul în care programatorul nu defineşte explicit destructorul clasei, compilatorul generează în mod automat
cod pentru destructor, ce eliberează memoria alocată datelor membru (nu şi memoria eventual alocată
dinamic, caz în care trebuie definit explicit destructorul clasei).

Exercițiul 2 Implementați o clasă Sir care conține următoarele date membru private: nume ( char *) și lungime
( int ). Clasa are următoarele funcții publice: constructor implicit, constructor cu parametri, constructor de
copiere, destructor, o funcție print(). Scrieți și un program de test (funcția main()) pentru clasa Sir.

Exercițiul 3 Implementați o clasă Student care conține următoarele date membru private:
- nume (string), adresa (string), nrCursuri (int)
- cursuri (string[20]), note (int[20]);
Data membru nrCursuri ține evidența numărului de cursuri la care studentul participă la un moment dat.
Clasa are următoarele funcții publice:
- Un constructor cu parametri care inițializează datele membru nume, adresa si nrCursuri.
- O funcție getNume(), o funcție getAdresa();
- O funcție setAdresa() pentru modificarea adresei sudentului.
POO

- O funcție print () care afișează numele și adresa studentului.


- O funcție adaugaCurs(), care adaugă un curs și nota obținută la acel curs de catre student.
- O funcție printNote (), care afișează numele cursului si nota corespunzătoare acelui curs.
- O funcție getMediaGenerala (), care returnează media tuturor notelor obținute de student.
Scrieți și un program de test (funcția main()) pentru clasa Student.

Temă pentru acasă

1. Se consideră două tablouri unidimensionale cu elemente numere întregi ordonate crescător. Scrieți o
funcție numită interclasare() care va construi un nou vector care să conțină elementele din cei doi
vectori în ordine crescătoare. Funcția are ca parametri: cei doi vectori de tip int și dimensiunile lor și va
returna un pointer la noul vector obținut prin interclasarea celor doi vectori transmiși ca parametri.

2. Implementați o clasă Complex care conține următoarele date membru private:


- real și imag (double), cu valorile implicite 0.0.
Clasa are următoarele funcții publice:
- constructor implicit, constructor cu parametri, constructor de copiere, destructor
- o funcție getReal(), o funcție getImag()
- o funcție setComplex() care atribuie valori datelor membru real și imag
- o funcție print() care afișează numărul complex
- o funcție eReal() care returnează true (bool) dacă imag este 0
- o funcție eImag() care returnează true (bool) dacă real este 0
- o funcție suma() ce adună două numere complexe date ca parametri. Funcția returneaza suma celor
două numere.
- o funcție modul() ce calculează și returnează modulul unui număr complex.
Scrieți și un program de test (funcția main()) pentru clasa Complex.

S-ar putea să vă placă și