Descriere: Un tutorial folositor pentru cei care lucreaza in limbajul de programare C++
Download: -
Autor: Nu este specificat
Sursa (Link-ul oficial): -
Propria parere: Folositor
Tutorialul: Mai jos.
Redefinirea acestor doi operatori implica mai multe restrictii:
a. "new" trebuie sa returneze "void*" si sa aiba ca prim parametru un "size_t" (tip de data definit in "stdlib.h" si utilizat pentru manipularea lungimii zonelor de memorie destinate pastrarii obiectelor);
b. "delete" trebuie sa returneze "void", sa aiba un parametru "void" si eventual un al doilea de tipul "size_t".
c. ambii operatori vor fi implicit si obligatoriu metode statice;
d. din precedenta conditie reiese ca "new" si "delete" nu pot fi virtuali.
Operatorii standard "new" si "delete" pot fi apelati atat in domeniul de vizibilitate al clasei ce-i redefineste, cat si in cel al altor clase derivate din aceasta.
Exemplu:
Code: Select all
#include <iostream.h>
class exemplu {
int a, b, c;
// membrul "lungime" se va declara "static" pentru
// a putea fi accesat in cele doua metode statice
// "new" si "delete"
static short lungime;
Code: Select all
exemplu(void) {
cout<<"Apel constructor EXEMPLU\n";
a=b=c=0;
}
~exemplu(void) {
cout<<"Apel destructor EXEMPLU\n\n";
}
// se utilizeaza parametrul "lng" deoarece eventualele
// clase derivate din "exemplu" pot avea lungimi diferite
// de cea a clasei de baza
void * operator new(size_t lng) {
cout<<"Operatorul \"new\" redefinit !!!\n";
lungime=lng;
// tipul argumentului (sir de caractere) este suficient
// pentru a specifica faptul ca se apeleaza
// operatorul standard "new"
return (void*) new char[lng];
}
void operator delete(void * p)
{
// se tipareste lungimea obiectului (in octeti)
cout<<exemplu::lungime<<"\n\nOperatorul \"delete\" redefinit!!!\n";
// tipul argumentului (pointer la "char") este
// suficient pentru a specifica faptul ca se
// apeleaza operatorul standard "delete"
delete[lungime] (char*) p;
}
};
// variabilele membru statice trebuie initializate
short exemplu::lungime=0;
class derivat : public exemplu {
double db1;
Code: Select all
derivat(void) {
cout<<"Apel constructor DERIVAT\n\n";
db1=12.34;
}
~derivat(void) {
cout<<"Apel constructor DERIVAT\n\n";
}
};
void main(void) {
exemplu *ptr;
derivat *ptd;
ptr=new derivat;
delete ptd;
getch();
}
Operatorul "new" redefinit!!!
Apel constructor EXEMPLU
Apel destructor EXEMPLU
6
Operatorul "delete" redefinit!!!
Operatorul "new" redefinit!!!
Apel cosntructor EXEMPLU
Apel destructor DERIVAT
Apel destructor DERIVAT
Apel destructor EXEMPLU
14
Operatorul "delete" redefinit!!![/b]