marți, 29 ianuarie 2008

Destructorul in clasele C++

De fiecare data cand creati o instanta a obiectului ce l-ati creat se executa constructorul automat, ei bine inainte de distrugerea obiectului se apeleaza automat functia destructor. Functiile destructor au aceeasi denumire ca si clasa. Diferenta fata de destructori este ca au in fata caracterul tilda ~ care trebuie sa preceada numele fiecarei functii destructor.
Functiile destructor nu accepta parametri si nici nu returneaza valori. Deci intodeauna prototipul functiei destructor va arata asa: ~NumeClasa();
Functiile destructor sunt necesare in special in momentul in care alocam dinamic memorie. Atunci cand toate datele sunt alocate static ex: int[10], char etc. C++ se va ocupa automat de o mare parte din procesul de distrugere, stergere a datelor. Daca insa datele membre sunt alocate dinamic este bine sa va asigurati ca acele date au fost sterse.
Ex:

class Carte
{
public:
char* titlu;
Carte(char* titlu = "Titlu");
~Carte();

};

Carte::Carte(char* titlu)
{
this->titlu = new [strlen(titlu)+1];
strcpy(this->titlu,titlu);
}
Carte::~Carte()
{
delete[] titlu;
}

Constructorii de clase in C++

Constructorul unei clase este o functie speciala care se excuta automat ori de cate ori programu creeaza o noua instanta de clasa. Functia constructor trebuie sa aiba acelasi nume cu clasa din care face parte si sa fie publica in cadrul clasei, adica accesibila tuturor. Functiile constructor nu returneaza valori.

Ex:


class Carte
{
public:
Carte(); //declararea constructorului

};



Functia constructor se executa in momentul in care se ajunge cu codul executabilului la declararea unei variabile de tipul clasei. Daca se intalnesc mai multe instante una dupa alta constructorul se executa in ordine de la stanga la dreapta de sus in jos, daca variabila este globala functia constructor se executa inainte de functia main.
Functiile constructor pot primi si parametri. Mai jos este un exemplu de clasa cu o mai multe functii constructor supraincarcate.


class Carte
{
int ID;
public:
char* titlu;
int nrPag;
Carte();
Carte(char* titlu);
Carte(Carte& c);

};
Carte::Carte()
{
ID = 0;
nrPag = 0;
titlu = new char[strlen("Titlu")+1];
strcpy(titlu,"Titlu");
}
Carte::Carte(char* titlu)
{
ID = 0;
nrPag = 0;
Carte::titlu = new char[strlen(titlu)+1];
strcpy(Carte::titlu,titlu);

}
Carte::Carte(Carte& c)
{
titlu = new char[strlen(c.titlu)+1];
strcpy(titlu,c.titlu);
nrPag = c.nrPag;
ID = c.ID;
}


Constructorul de mai sus ce primeste ca parametru prin referinta insasi clasa se numeste constructor de copiere. Acesta se apeleaza atunci cand se instantiaza o variabila cu ajutorul operatorului egal sau cand se copiaza pe stiva la apelul unei functii clasa noastra. ex cand initializam clasa c:
Carte d;
Carte c = d; //se porneste constructorul de copiere
o_functie(c); //cand se apeleaza aceasta functie se apeleaza si constructorul de copiere pentru variabila temporara ce va fi folosita in cadrul functiei.

c=d; //nu este pornit constructorul de copiere


Exercitiu:Creati clasa student ce are atributele: nume, vartsa si notaBac. Creati un constructor fara parametri, unul ce are 3 parametri si un constructor de copiere. In main trebuie sa fie initializati doi studenti unul prin constructor implicit altul prin constructorul cu parametri.Compilati si executati programul.