CATEGORII DOCUMENTE |
Constructori si destructori in tehnica OOP
Constructori
Datele de tip predefinit sau definit de utilizator se aloca in mod automat, in conformitate cu declaratia sau definitia acestora. Odata cu alocarea datelor se pot face si initializari.
In cazul obiectelor, acestea se aloca la instantierea lor. De asemenea, obiectele pot fi initializate la instantiere. In acest scop, utilizatorul poate defini constructori, care sunt functii membru de acelasi nume cu numele clasei. Se pot defini mai multi constructori pentru o clasa. In acest caz, ei sunt functii supraincarcate si difera prin numarul si/sau tipul parametrilor.
Un constructor fara parametrii se numeste constructor implicit. In cazul in care exista un constructor implicit, nu se mai poate defini pentru clasa respectiva un constructor cu toti parametrii impliciti. Un astfel de constructor duce la ambiguitate la instantierea obiectelor.
Prezenta constructorilor nu este obligatorie. Se pot defini clase si fara constructori. In acest caz, compilatorul C++ genereaza in mod automat un constructor fara parametrii, numit constructor implicit. Acesta are rol numai de alocare a obiectelor clasei respective. Constructorii definiti de programator sunt necesari numai in cazul in care se doreste initializarea obiectelor la instantierea lor.
In cazul in care o clasa are cel putin un constructor si nici unul nu este constructor implicit, atunci nu se pot instantia obiecte neinitializate.
Parametrii unui constructor pot fi de orice tip, cu exceptia tipului definit de clasa pentru care este functie membru. In schimb, constructorul unei clase poate avea ca parametrii pointeri sau referinte la obiectele clasei respective.
clasa(clasa p) //gresit
clasa(clasa *p) //corect
clasa(clasa &p) //corect
Constructorul
clasa (const clasa &p)
este un constructor special care permite copierea obictelor. El se numeste constructor de copiere. Constructorul de copiere poate avea si alti parametrii, insa ei trebuie sa fie impliciti.
Constructorul de copiere se apeleaza intr-o instantiere de felul celei de mai jos:
clasa c(); //instantiere cu initializare obisnuita
clasa c1=c, //se apeleaza constructorul de copiere. c1 este o copie a lui c
Destructori
Destructorii sunt functii care actioneaza in sens invers fata de constructori. Ei au multe caracteristici in comun cu constructorii, dar intre ei exista si diferente.
Numele unui destructor este numele clasei precedat de caracterul Un destructor nu are parametrii si el este unic pentru o clasa. Daca programatorul nu a definit un destructor, atunci compilatorul geneareaza un destructor pentru clasa respectiva.
Antetul destructorilor nu contine cuvantul void, desi ei nu returneaza valori. De aceea, destructorii au antetul:
~ nume_clasa()
In afara definitiei clasei, antetul destructorului va fi:
nume_clasa::~ nume_clasa()
Ca si in cazul constructorilor, adresa destructorilor nu poate fi determinata.
Daca la instantierea unui obiect s-au apelat mai multi constructori, atunci la distrugerea lui, destructorii se vor apela in ordine inversa.
Pentru un obiect global, destructorul se apeleaza ca parte a procedurii exit de la terminarea executiei functiei main. De aceea, un astfel de destructor nu trebuie sa apeleze functia exit deoarece se intra intr-un ciclu infinit. Pentru un obiect local, destructorul se apeleaza cand controlul programului iese din domeniul lui.
Obiectele dinamice nu pot fi distruse automat. Distrugerea se realizeaza de catre programator deoarece numai el stie cand un astfel de obiect nu mai este necesar. Destructorul poate fi apelat de catre programator atat direct cat si indirect prin intermediul operatorului delete.
Exemplu : Sa se realizeze o aplicatie pentru reprezentarea unui numar complex folosind constructori .
#include<iostream.h>
class complex
//constructor de initializare (constructorul implicit)
complex()
//constructor de initializare prin preluare (constructor de copiere)
complex(const complex& z)
//destructor
~complex()
void afisare(char* s)
};
void main()
Subiectul 4. Supraincarcarea operatorului apel de functie "( )"
Un operator remarcabil este operatorul standard de apel de functie, pe care limbajul il considera operator binar ce se evalueaza sub forma a(b), unde a este numele functiei, iar b este o lista de expresii eventual vida.
class matrice
//constructorul de initializare - dezvoltare
matrice::matrice(int i,int j)
//supraincarcarea operatorului apel de functie - dezvoltare
int* matrice::operator()(int i,int j)
//supraincarcarea operatorului "+" - dezvoltare
matrice operator+(matrice a,matrice b)
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2353
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved