Documente Academic
Documente Profesional
Documente Cultură
LABORATOR 3
Alocarea dinamică a memoriei în C++. Clase și obiecte.
Î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.
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.
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
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.