Sunteți pe pagina 1din 6

Operatorul new pentru alocare dinamică (I)

n Operatorul new pentru alocarea dinamică


Alocarea dinamică de idPointer = new tip;
memorie. alocă un spațiu de memorie în heap pentru a reține o dată de
Date și funcții statice. tipul tip
n Exemplu
Mihai Gabroveanu float *p;
p= new float;
*p=2.67;

Alocarea dinamică de memorie.


Date și funcții statice. 3

Alocare dinamică de memorie Operatorul new pentru alocare dinamică (II)

n Alocare/eliberarea de memorie în limbajul C n operatorul new pentru alocarea dinamică și inițializare


void * malloc ( size_t size );
void free ( void * ptr ); idPointer = new tip(expresie);
n Dezavantaje:
alocă un spațiu de memorie în heap pentru a reține o dată de
¨ necesită conversia explicită a pointerului returnat și specificarea
numărului de octeți tipul tip și inițializează data din zona alocată cu expresie
int *p=(int *) malloc(sizeof(int));
¨ nu permit inițializarea/eliberarea obiectelor
n exemplu
n malloc() nu apelează constructorii float *p;
n free() nu apelează destructorii
n În programele C++ nu vom utiliza malloc() și free() pentru a p= new float(2.67);
aloca/elibera obiecte dinamic

Alocarea dinamică de memorie. Alocarea dinamică de memorie.


Date și funcții statice. 2 Date și funcții statice. 4
Operatorul new pentru alocare dinamică (III) Alocare dinamică de obiecte (I)

n operatorul new pentru alocarea dinamică de tablouri n Alocare spațiu pentru un singur obiect
idPointer = new tip[dim_max];
idPointerObiect = new IdClasa(lista_de_parametri);
alocă un spațiu de memorie în heap pentru a reține un tablou
de dim_max elemente de tipul tip alocă un spațiu de memorie în heap pentru a reține
n exemplu un obiect de tipul IdClasa pentru inițializarea acestuia
float *t; apelându-se constructorul clasei cu parametri
t= new float[10]; lista_de_parametri
t[0]=2.3; Dacă lista de parametri e vidă atunci se apelează
t[1]=7.2; constructorul implicit

Alocarea dinamică de memorie. Alocarea dinamică de memorie.


Date și funcții statice. 5 Date și funcții statice. 7

Operatorul delete Alocare dinamică de obiecte (II)

n operatorul delete eliberează zonele alocate dinamic n Alocare spațiu pentru un tablou de obiecte
delete idPointer; idPointerObiect = new IdClasa[dim_max];
delete []idPointerTablou;
n exemplu alocă un spațiu de memorie în heap pentru a reține
int *p = new int; un tablou de dim_max obiecte de tipul IdClasa, pentru
float *t = new float[10]; inițializarea acestora apelându-se de dim_max ori
... constructorul implicit.
delete p; n Dacă nu există un constructor implicit se generează
delete []t; eroare în momentul compilării

Alocarea dinamică de memorie. Alocarea dinamică de memorie.


Date și funcții statice. 6 Date și funcții statice. 8
Eliberarea obiectelor alocate dinamic (I) Exemplu
class Punct{
private:
Output
float x; Apel constructor implicit Punct(0,0)
Apel constructor Punct(3,4)
n Eliberare obiect alocat dinamic float y;
public:
Punct(){ Apel constructor implicit Punct(0,0)
Apel constructor implicit Punct(0,0)
delete idPointerObiect;
x=0;
Apel constructor implicit Punct(0,0)
y=0;
printf("Apel constructor
Apel destructor pentru obiectul (0, 0)
implicit Punct(0,0)\n");
Apel destructor pentru obiectul (3, 4)
se eliberează spațiul de memorie indicat de }
Punct(float x, float y){
Eliberez tabloul:
Apel destructor pentru obiectul (0, 0)

idPointerObiect. Înainte de eliberare se apelează


this -> x = x; Apel destructor pentru obiectul (0, 0)
this -> y = y; Apel destructor pentru obiectul (0, 0)
printf("Apel constructor Punct(%g,%g)\n", x,y);
}
automat destructorul obiectului referit. ~Punct(){
printf("Apel destructor (%g, %g)\n", x,y);
}
};

int main(){
Punct *p1 = new Punct;
Punct *p2 = new Punct(3,4);
Punct *t = new Punct[3];
delete p1;
delete p2;
printf("Eliberez tabloul:\n");
delete []t;
Alocarea dinamică de memorie. getch(); Alocarea dinamică de memorie.
Date și funcții statice. 9 } Date și funcții statice. 11

Eliberarea obiectelor alocate dinamic (II) Pointerul this


n Eliberare tablou de obiecte: n Este un parametru introdus de compilator în mod
delete []idPointerTablouDeObiecte; implicit la apelului unei funcţii membru nestatice
se eliberează spațiul de memorie indicat de dintr-o clasă
idPointerTablouDeObiecte. Înainte de eliberare se n El indică către obiectul curent pentru care a fost
apelează automat destructorul fiecărui obiect din apelată funcția membru
tablou. n Exemplu:
idOb.numeFunctie(lista de parametri);
în momentul apelului, pe langă parametri transmişi explicit, se
mai transmite un parametru numit this ce indică către idObj
Alocarea dinamică de memorie. Alocarea dinamică de memorie.
Date și funcții statice. 10 Date și funcții statice. 12
Date membre statice (I) Date membre statice. Exemplu
class Produs{
Declarare int main(){
private:
Produs p1("CPU", 100);
n Datele membre statice sunt date membre ale unei char nume[100];
float pret; //fara TVA Produs p2("HDD", 200);
clase ce sunt partajate de toate obiectele static float PROCENT_TVA;
public:
p1.afisare();
p2.afisare();
Produs(char *nume, float pret){ }
n Spre deosebire de datele membre obişnuite care strcpy(this -> nume, nume);
this -> pret = pret; OUTPUT
există în câte un exemplar pentru fiecare obiect, }
void afisare(){
Nume: CPU
Pret fara TVA: 100
datele membre statice nu aparţin fiecărui obiect al printf("Nume: %s\n", nume);
printf("Pret fara TVA: %g\n", pret); Pret cu TVA: 119
Nume: HDD
clasei, ci există într-un singur exemplar comun }
printf("Pret cu TVA: %g\n", getPretCuTVA());
Pret fara TVA: 200

tuturor obiectelor clasei respective. float getPretCuTVA(){ Pret cu TVA: 238


return pret*(1+PROCENT_TVA);
}
n Se iniţializează automat cu 0 (daca sunt de tipuri };
Definire

predefinite) float Produs::PROCENT_TVA = 0.19;

Alocarea dinamică de memorie. Alocarea dinamică de memorie.


Date și funcții statice. 13 Date și funcții statice. 15

Date membre statice (II) Funcții membre statice (I)


n Se declară în interiorul clasei cu ajutorul cuvântului cheie static n Funcţiile membre statice se utilizează cu scopul de
class IdClasa {
… a sugera faptul că acţionează asupra instanţelor
static tip idDataMembStatica; clasei văzute ca un întreg şi nu asupra instanţelor

}; clasei în mod individual.
n Se definesc în afara clasei n Pot acționa doar asupra atributelor statice (ale
tip IdClasa::idDataMembStatica = val_initiala;
n Referirea datelor membre statice:
claselor),
IdClasa:: idDataMembStatica // Recomandat n Nu pot acţiona asupra atributelor obiectului curent
idObiect.idDataMembStatica
idPointerObiect -> idDataMembStatica
(deoarece nu li se transmite pointerul this)
n Nu pot apela decât funcţii membre statice

Alocarea dinamică de memorie. Alocarea dinamică de memorie.


Date și funcții statice. 14 Date și funcții statice. 16
Funcții membre statice (II) Funcții membre constante (I)
n Sintaxa declarării/definiri n Funcţiile membre constante sunt funcţii
class IdCasa{

};
static tip idMetodaStatica(lista_de_parametri); ce au acces la datele membre dintr-o
tip IdCasa::idMetodaStatica(lista_de_parametri){

clasă fără însă a putea modifica valorile
} acestora
n Utilizare
IdClasa:: idMetodaStatica(lista_de_parametri); // Recomandat
n Pot apela numai funcţii membre
idObiect.idMetodaStatica(lista_de_parametri);
idPointerObiect -> idMetodaStatica(lista_de_parametri);
constante

Alocarea dinamică de memorie. Alocarea dinamică de memorie.


Date și funcții statice. 17 Date și funcții statice. 19

Funcții membre statice. Exemplu Funcții membre constante (II)


class Produs{
. . .
static float PROCENT_TVA; OUTPUT
Nume: CPU
n Sintaxa declarării/definiri
public:
static float getTVA(); Pret fara TVA: 100
static void setTVA(float TVA); Pret cu TVA: 119
}; Nume: HDD
float Produs::PROCENT_TVA = 0.19;
float Produs::getTVA(){
Pret fara TVA: 200
Pret cu TVA: 238
class IdCasa{
return PROCENT_TVA;
Nume: CPU
}
void Produs::setTVA(float TVA){ Pret fara TVA: 100
Pret cu TVA: 125
tip idMetodaConstanta(lista_de_parametri) const;
PROCENT_TVA = TVA;
}
int main(){
Nume: HDD
Pret fara TVA: 200 };
Produs p1("CPU", 100); Pret cu TVA: 250
Produs p2("HDD", 200);
p1.afisare(); tip IdCasa::idMetodaConstanta (lista_de_parametri) const{
p2.afisare();
Produs:: PROCENT_TVA = 0.25; Inaccesibil!
Produs::setTVA(0.25);

p1.afisare();

}
p2.afisare();
}

Alocarea dinamică de memorie. Alocarea dinamică de memorie.


Date și funcții statice. 18 Date și funcții statice. 20
Funcții membre constante.Exemplu
class Punct { class Vector {
private: Functii constante private:
float x; Punct o;
float y; Punct v;
public: public:
Punct(float x=0, float y=0){ Vector(float x1, float y1,
this->x=x;this->y=y; float x2, float y2):o(x1,y1),
cout<<"Apel constructor Punct"<<endl; v(x2,y2){
} cout<<"Apel constructor Vector"<<endl;
~Punct(){ }
cout<<"Apel destructor Punct"<<endl; ~Vector(){
} cout<<"Apel destructor Vector"<<endl;
void afisare() const { }
cout<<"("<<x<<","<<y<<")"; float lungime() const{
} return Punct::distanta(o,v);
static float distanta(const Punct &p1, }
const Punct &p2){ };
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+ int main(){
(p1.y-p2.y)*(p1.y-p2.y)); Vector vect(0,0,3,4);
} cout<<"Lungime:"<<vect.lungime()<<endl;
}; }

Parametri constanţi
Apel constructor Punct
Apel constructor Punct
Output: Apel constructor Vector
Lungime:5
Apel destructor Vector
Apel destructor Punct Alocarea dinamică de memorie.
Apel destructor Punct Date și funcții statice. 21

Temă
n Sa se implementeze clasa Matrice în care
elementele sunt reprezentate sub forma unui
tabel unidimensional alocat dinamic.
n Să se implementeze clasa DataCalendaristica
care să permită afişarea datei sub mai multe
formate (25.07.2019, 25 iulie 2019). Să se
implementeze o metodă care calculează
diferența dintre două date calendaristice
Alocarea dinamică de memorie.
Date și funcții statice. 22

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