Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Operatorii new si delete sunt utilizati pentru alocarea dinamica a datelor in memoria heap. Pentru supraincarcarea acestor operatori se pot folosi numai functii membre statice ale clasei. Prototipul functiilor de supraincarcare a operatorilor new si delete sunt
void* operator new(size_t lungime);
void operator delete(void* p);
In ambele situatii, functiile sunt implicit statice, fara sa fie nevoie de utilizarea specificatorului static
Tipul size_t este un tip definit in fisierul de biblioteca stdlib.h (intreg fara semn), iar lungime este dimensiunea in numar de octeti a zonei de memorie care trebuie sa fie alocata. Aceasta valoare (lungime) nu trebuie sa fie specificata la apelul unei functii operator new, deoarece compilatorul calculeaza in mod automat dimensiunea obiectului pentru care se aloca zona de memorie. Pointerul universal (void*) returnat are ca valoare adresa de inceput a zonei de memorie alocata.
Functia operator delete() primeste un pointer catre regiunea de memorie pe care trebuie sa o elibereze.
Operatorii new si delete pot fi supraincarcati global, astfel incat orice utilizare a lor sa foloseasca versiunea supraincarcata, sau pot fi supraincarcati pentru o anumita clasa, si in aceasta situatie functiile operator trebuie sa fie membre statice ale clasei.
La intalnirea unuia dintre operatorii new sau delete pentru un anumit tip, compilatorul verifica mai intai daca acesta a fost supraincarcat pentru clasa respectiva. Daca a fost supraincarcat, se foloseste versiunea supraincarcata a clasei; daca nu, este apelat operatorul new sau delete global. Daca acestea au fost supraincarcate, se utilizeaza aceste versiuni.
n Exemplul 5
Se considera supraincarcarea operatorilor new si delete pentru clasa Point. In acest exemplu simplu operatorul supraincarcat nu modifica modul de alocare sau de dezalocare a memoriei, ci doar adauga un mesaj la consola.
class Point;
void* Point::operator new(size_t dim)
void Point::operator delete(void* p)
void f5()
Expresiile de forma ::new sau ::delete se refera la versiunea predefinita (globala) a operatorilor de alocare dinamica, folosind operatorul de rezolutie Daca si aceste versiuni au fost supraincarcate, atunci este apelata functia supraincarcata, dar aceasta este o practica mai putin frecventa. La executia functiei f5(), la consola sunt afisate urmatoarele mesaje
Creare punct nou
Distrugere punct
Creare punct nou
Distrugere punct
Creare punct nou
Distrugere punct
Operatorul new supraincarcat se apeleaza la fel ca operatorul new predefinit
X* pX = new X(arg1, arg2,
Daca in clasa X operatorul new a fost supraincarcat, atunci este apelata versiunea supraincarcata a acestuia, iar argumerntele arg1 arg2, . sunt folosite pentru selectia constructorului clasei X, apelat implicit de functia operator new()
In functia f5() s-au apelat trei constructori diferiti (constructorul implicit, cu un argument si cu doua argumente) pentru primele trei alocari a cate unui obiect din clasa Point si, de fiecare data, la distrugere a fost apelata functia operator delete supraincarcata a clasei Point. Mesajele afisate evidentiaza acest luccru.
n
Din exemplul prezentat mai sus se poate observa ca la constructia unui tablou de obiecte de tip Point new Point[7]) este folosit operatorul new predefinit (global) si nu functia operator new a clasei Point. La fel, la stergerea tabloului se foloseste operatorul global delete [].
Aceasta situatie apare datorita faptului ca, pentru alocarea dinamica a tablourilor de obiecte folosind operatori supraincarcati, trebuie sa fie supraincarcati operatorii new si delete in versiunea pentru tablouri de obiecte care arata astfel
void* operator new[](size_t lungime);
void operator delete[](void* p);
Politica de confidentialitate |
Copyright © 2024 - Toate drepturile rezervate