[Tutorial C/C++/C#] Redefinirea operatorilor

Locked
User avatar
LaUR SNG
Fondator
Fondator
Posts: 9038
Joined: 8 years ago
Location: SNAGOV
Has thanked: 11 times
Been thanked: 6 times
Zodiac:
Age: 21
Contact:
Status: Offline
Romania

8 years ago

Nume Tutorial: Redefinirea operatorilor "new" și "delete"
Descriere: Un tutorial folositor pentru cei care lucreaza in limbajul de programare C++
Download: -
Autor: Nu este specificat
Sursa (Link-ul oficial): -
tutorialeprogramare.ro


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;
public:

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;
public:

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();
}
Executia programului va determina tiparirea pe ecran a urmatoarelor date:

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]
„Iubiti totul cu toată inima ... căci viața se termină când vrea ea si pe nepusă masă !” – LaUR SNG

https://photos.app.goo.gl/WbQsF4C9QfvDvWSo6

Curios ? Nu il deschide :13:

[spoiler]Image[/spoiler]
[spoiler]Image[/spoiler]

https://www.facebook.com/10043517804227 ... 039605115/
Locked

Return to “C / C++ / C#”