17
Programarea orientată obiect Constructori şi destructori

12 - POO - Constructori Si Destructori

Embed Size (px)

Citation preview

Page 1: 12 - POO - Constructori Si Destructori

Programarea orientată obiect

Constructori şi destructori

Page 2: 12 - POO - Constructori Si Destructori

Elemente noi în C++

• Transferul parametrilor prin adresă

void suma(int a, int b, int &c)

{ c = a + b; }

int x, y, z;

suma(x, y, z);

• Operatorii new şi delete ( new TIP, delete VAR)

int *p, *q;

p = new int; p = (int*) malloc (sizeof(int));

q = new int[10]; q = (int*) malloc (10*sizeof(int));

delete p;

delete q;

Page 3: 12 - POO - Constructori Si Destructori

Constructor

• Metodă specială care creează un obiect– Alocă spaţiu (spaţiu propriu, spaţiu extins, modelul referinţă)

– Iniţializează atributele (atribute private)

Seg. date / stivă Heap

Obiect (referinţă)

Obiect propriu-zis

Obiect propriu-zis

Page 4: 12 - POO - Constructori Si Destructori

Constructor

• Acelaşi nume ca şi clasa

• Nu are rezultat (nici void)

• Pot fi mai mulţi

• Există un constructor implicit – alocă spaţiul propriu

• Nu se apelează explicit

• Prototip (în descrierea clasei): nume_clasa(lista_parametri_formali);

• Utilizarenume_clasa nume_obiect(lista_parametri_actuali);

Complex a = Complex(2,5);

Page 5: 12 - POO - Constructori Si Destructori

Constructor• Exemplu:Care poate fi starea iniţială pentru un obiect din clasa Matrice? (dinamic -> spaţiu extins)

class Matrice { float** a; int l, c, lmax, cmax;

public:Matrice();Matrice(float**x, int m, int n, int lm, int

cm); };

Matrice::Matrice(){ a = NULL; l = c = lmax = cmax = 0; }Matrice::Matrice(float**x, int m, int n, int lm, int cm){ int i,j; l = m; c = n; lmax = lm; cmax = cm; a = new float*[lmax]; for(i=0; i<lmax; i++) a[i] = new float[cmax]; for(i=0; i<l; i++) for(j=0; j<c; j++) a[i][j] = x[i][j];}

Matrice a;

Matrice b(z, 5, 5, 10, 10);

Page 6: 12 - POO - Constructori Si Destructori

Constructor

• Transferul parametrilor– 1 constructor: conversii obişnuite

– >1 constructori: se alege cel cu cea mai potrivită listă de parametri

• Parametri impliciţi– tip nume = valoare_implicită

Page 7: 12 - POO - Constructori Si Destructori

ConstructorExemplu:class Complex { float p_reala, p_imaginara;

public: Complex(float a = 0, float b = 0 ); };

Complex::Complex(float a,float b){ p_reala = a; p_imaginara = b; }

Complex a; // a reprezintă numarul 0 + i*0Complex b(-1); // b reprezintă numarul -1+ i*0Complex c(2,3); // c reprezintă numarul 2 + i*3

Complex(float a, float b = 0 ); Complex(float a = 0, float b );

Complex a = 1; // a reprezintă numarul 1+i*0

Page 8: 12 - POO - Constructori Si Destructori

Constructor vid

• Şi obiecte iniţializate şi obiecte neiniţializate:– Constructor(i) cu parametri– Constructor(i) cu parametri impliciţi– Constructor vid – simulează constructorul implicit

Complex::Complex()

{

}

Complex a; // a este obiect neinitializat

Page 9: 12 - POO - Constructori Si Destructori

Constructor de copiere

• Parametrii unui constructor pot fi– Orice tip, inclusiv pointer sau referinţă la clasa curentă– Excepţie: clasa curentă

• Constructor de copiere– Realizează o copie binară a unui obiect (doar spaţiul

propriu - atenţie la spaţiul extins)– Se generează unul implicit, acolo unde nu există unul

explicit

– 1 parametru referinţă către clasa curentă– Eventual alţi parametri, dar cu valori implicite

Page 10: 12 - POO - Constructori Si Destructori

Constructor de copiere• Exemplu:

class Matrice { float** a; int l, c, lmax, cmax;

public: Matrice(Matrice &x);

… };

Matrice::Matrice(Matrice &x){ int i,j; l = x.getl(); c = x.getc(); lmax = x.getlm(); cmax = x.getcm(); a = new float*[lmax]; for(i=0; i<lmax; i++) a[i] = new float[cmax]; for(i=0; i<l; i++) for(j=0; j<c; j++) a[i][j] = x.get(i,j);}

Matrice a; // matrice “vidă”Matrice b = a; // b este o copie a lui aMatrice c(b); // c este o copie a lui b

Page 11: 12 - POO - Constructori Si Destructori

Destructor

• Metodă specială care încheie existenţa unui obiect– Dezalocă spaţiul de memorie

– Acelaşi nume ca şi clasa, precedat de ~ (tilda)

– Nu are rezultat (nici void)

– Nu are parametri

– Un singur destructor explicit

– Destructor implicit

– Poate fi apelat explicit

Page 12: 12 - POO - Constructori Si Destructori

Destructor class Matrice { float ** a;

int l, c, lmax, cmax; public: ~Matrice(); };Matrice::~Matrice()

{ int i;

if(a)

{ for(i=0; i<lmax; i++)

delete a[i];

delete a;

l = c = lmax = cmax = 0;

a=NULL;

}}

Matrice a; …a.~Matrice();

Page 13: 12 - POO - Constructori Si Destructori

Clasa Nodclass Nod { float info; Nod* next; public: float GetInfo(); Nod* GetNext(); Nod(float a, Nod* n); };

float Nod::GetInfo(){ return info;}

Nod* Nod::GetNext(){ return next;}

Nod::Nod(float a, Nod* n){ info = a; next = n;}

Page 14: 12 - POO - Constructori Si Destructori

Clasa Stivă Dinamicăclass Stiva { Nod* Cap; public: Stiva(); Stiva(float a); ~Stiva(); void Push(float a); float Pop(); int Empty(); void Afiseaza(); };

Stiva::Stiva(){ Cap = NULL;}

Stiva::Stiva(float a){ Cap = new Nod(a, NULL);}

Stiva::~Stiva(){ Nod* x; while(Cap) { x = Cap; Cap = Cap->GetNext(); delete x; }}

Page 15: 12 - POO - Constructori Si Destructori

Clasa Stivă Dinamicăfloat Stiva::Pop(){ float x; Nod* y; y = Cap; x = Cap->GetInfo(); Cap = Cap->GetNext(); delete y; return x;}

void Stiva::Push(float a){ Cap=new Nod(a,Cap);}

int Stiva::Empty(){ return Cap?0:1;}

void Afiseaza(){ Nod* x; x = Cap; while(x) { printf("%5.2f ", x->GetInfo()); x = x->GetNext(); }}

Page 16: 12 - POO - Constructori Si Destructori

Clasa Stivă Dinamicăvoid main(){ Stiva s; int i; float x; if(s.Empty()) printf("\nStiva este goala"); else printf("\nStiva contine date");

for(i=0;i<10;i++) s.Push((float)i);

s.Afiseaza(); x=s.Pop(); s.Afiseaza();

if(s.Empty()) printf("\nStiva este goala"); else printf("\nStiva contine date");

s.~Stiva();

if(s.Empty()) printf("\nStiva este goala"); else printf("\nStiva contine date");}

Page 17: 12 - POO - Constructori Si Destructori

Spor la învăţat !