Sunteți pe pagina 1din 54

Universitatea Constantin Brncui din Trgu-Jiu

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

Programare orientat pe
obiecte
LECTOR DR. ADRIAN RUNCEANU

Curs 2
Constructori i destructori

Programare orientat pe obiecte (C++/Java)

14.10.2013

Constructori i destructori
3

1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::

Programare orientat pe obiecte (C++/Java)

14.10.2013

1. Definiii
4

Pentru crearea, iniializarea, copierea i


distrugerea obiectelor, n C++ se folosesc funcii
membre speciale, numite constructori i
destructori:
Funcia de tip constructor se apeleaz automat la
crearea fiecrui obiect al clasei, creare care poate fi
static sau dinamic (folosind operatorul new).
Funcia de tip destructor se apeleaz automat la
eliminarea unui obiect al clasei, la ncheierea
timpului de via sau, n cazul variabilelor dinamice,
este solicitat prin program (cu operatorul delete).
Programare orientat pe obiecte (C++/Java)

14.10.2013

1. Definiii
5

Aceste tipuri de functii se declara si se definesc


asemanator cu celelalte functii membre, dar au
cateva particularitati care le diferentiaza de acestea
prin:
1. Numele functiilor constructor sau destructor
coincide cu numele clasei careia i apartine; n
plus destructorii se diferentiaza prin faptul ca
numele lor este precedat de caracterul ~.
2. n declaratiile si definitiile constructorilor si
destructorilor nu se specifica nici un tip de
rezultat, nici macar tipul void.
Programare orientat pe obiecte (C++/Java)

14.10.2013

1. Definiii
6

3. Constructorii si destructorii nu pot fi mosteniti,

dar pot fi apelati de clasa derivata.


4. Nu se pot utiliza pointeri catre constructori sau
destructori.
5. Constructorii pot avea parametri, inclusiv
parametri impliciti, si pot fi supradefiniti.
Destructorii nu au aceste proprietati.
6. Un constructor fara parametri se numeste
constructor implicit.
Programare orientat pe obiecte (C++/Java)

14.10.2013

1. Definiii
7

7. Daca o clasa nu dispune de constructori si

destructori definiti, compilatorul va genera


automat un constructor implicit, respectiv
un destructor, care sunt si functii publice.
8. De obicei, constructorii si destructorii se
declara publici, deoarece, daca s-ar declara
privati atunci nu s-ar mai putea declara
obiecte de tipul respectiv.
Programare orientat pe obiecte (C++/Java)

14.10.2013

Constructori i destructori
8

1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
9

Prezentm n continuare un exemplu de clas care


implementeaz, o structur de tip list, n mod special o structur de tip coad - FIFO (First In First Out).
Obiectele acestei clase sunt structuri de date
controlate cu un set de funcii care asigur urmtoarele
operaii specifice:
iniializarea listei
adugarea(introducerea) unui element
tergerea(extragerea) unui element
verificarea dac lista este vid
verificarea dac lista este plin

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
10

Astfel, structura de date, mpreun cu metodele


de operare asociate reprezint un ansamblu cu o
funcionalitate bine definit.
Clasa conine cmpurile:
tab[100] - un vector definit static care conine
elementele listei
nrcrt - numrul curent(actual) de elemente aflate la
un moment dat n lista
prim - un numr care reprezint poziia primului
element din lista
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
11

funcia init() - introduce o valoare de pornire pentru

fiecare din cele dou variabile specifice, nrcrt


respectiv prim
funcia adaug() - adaug un element n list
funcia extrag() - extrage un element din list
funcia lista_vida() - returneaz 0 dac lista este
vid, sau 1 n caz contrar
funcia lista_plina() - returneaz 0 daca lista este
plin, sau 1 n caz contrar

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor Definirea se face in
12

interiorul clasei

Constructorul este simplu si poate fi definit inline:


#include<iostream.h>
class fifo
{
// declaratii de tip privat
int tab[100]; // vectorul de 100 de elemente
int nrcrt; // numarul curent de elemente din lista
int prim; // primul element din lista

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
13

public:
// declaratii de tip public
// functii inline
fifo()
{
nrcrt=prim=0 ;
cout<<Constructor fifo\n;
}
~fifo()
{
cout<<Destructor fifo\n;
}
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
14

void init()
// initializez lista
{
nrcrt=prim=0;
}
int lista_vida()
// verific daca coada este sau nu vida
{
return(nrcrt>0);
//daca nrcrt=0 atunci lista este vida
}
int lista_plina()
{
return(nrcrt<100); //daca nrcrt=100 atunci lista este plina
}
int adaug(int);
//adauga un element la sfarsit
int extrag(int&);
//extrage un element de la inceput
};
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
15

Pentru vizualizarea apelarii


constructorului, s-a adaugat un mesaj.
Clasa nu are nevoie de un destructor,
drept pentru care s-a adaugat unul formal,
care nu face nimic dar afiseaza un mesaj, de
identificare.

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
16

Se poate executa urmatorul program care sa


contina clasa fifo si care sa aiba doar declaratia unei
variabile si functia principala, astfel: fifo lista;
int main()
{}

Executia programului va avea ca efect,


urmatoarele afisari:
Constructor fifo
Destructor fifo

Chiar daca functia main() este vida, conform


definitiei unei clase, se obtine un astfel de rezultat.
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
17

n exemplul urmtor se reia declaraia


clasei fifo, pentru a obine liste de
dimensiune variabil, care implicit ar fi
egal cu 100 de elemente.
n acest scop, este necesar ca tabloul s
fie alocat dinamic.

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
18

Se fac urmtoarele modificri:


se elimin funcia init() si se prevede in schimb un

constructor care preia sarcina alocarii dinamice a


tabloului cu dimensiunea specificata si pe cea a
initializarii corespunzatoare a listei.
constructorul va fi supradefinit pentru a permite
utilizarea unor liste cu un numar implicit de 100 de
elemente in tablou.
de asemenea este definit un destructor pentru
eliberarea spatiului alocat pentru tablou.
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
19

Programul va ilustra declararea si


functionarea constructorilor si destructorilor
si va pune in evidenta momentele in care
acestia se apeleaza, prin afisarea unor
mesaje la ecran:

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
20

#include<iostream.h>
//lista FIFO cu nmax elemente

class fifo{
// declaratii de tip privat

int nmax;
int *tab;
int nrcrt;
int prim;

// dimensiunea listei
// adresa tabloului listei
// numarul curent de elemente din lista
// primul element din lista

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
21

public:
// declaratii de tip public
fifo(int); // constructor 1 care creeaza o lista cu un
numar de elemente
fifo(); // constructor 2 care creeaza o lista de 100
de elemente
~fifo();
// destructor
int adaug(int);
//adauga un element la sfarsit
int extrag(int&); //extrage un element de la
inceput

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
22

// functii inline
int lista_vida() // verific daca coada este sau nu
vida

{
return(nrcrt>0);

//daca nrcrt=0 atunci

lista este vida

}
int lista_plina()
{
return(nrcrt<nmax); //daca nrcrt=nmax
atunci lista este plina

}
Programare orientat pe obiecte (C++/Java)
};

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
23

// definitiile functiilor membre ale clasei fifo


// constructor 1, lista va avea n elemente

fifo::fifo(int n)
{
nmax=n;
tab=new int;
nrcrt=prim=0;
cout<<"Constructor 1, lista de
"<<nmax<<"elemente \n";
}
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
24

//constructor 2, implicit ; lista va avea 100


elemente
fifo::fifo()
{
nmax=100;
tab=new int;
nrcrt=prim=0;
cout<<"Constructor 2, lista de 100 de
elemente\n";
}
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
25

//destructor

fifo::~fifo()
{
cout<<"Destructor, lista de "<<nmax<<"
elemente\n";
delete tab;
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
26

int fifo::adaug(int k)

//definitia functiei membru este in afara declaratiei clasei resp. si deci,


trebuie specificat ca apartine clasei fifo prin folosirea operatorului de
rezolutie ::

if(lista_plina())
{
tab[(prim+nrcrt)%nmax]=k;
nrcrt++;
cout<<"Lista are "<<nrcrt<<" elemente\n";
return 1;
}
else
{
cout<<"Lista este plina\n";
return 0;
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
27

int fifo::extrag(int &k)


{
if(lista_vida())
{
k=tab[prim];
prim=(prim+1)%nmax;
nrcrt--;
cout<<"Lista mai are "<<nrcrt<<" elemente\n";
return 1;
}
else
{
cout<<"Lista este vida\n";
return 0;
}
}
Programare orientat pe obiecte (C++/Java)

14.10.2013

2. Crearea, iniializarea i eliminarea


obiectelor
28

int main(void)
{
int k,i;
fifo *plista;
// declaratia unui pointer la lista
plista=new fifo(20);
//creare obiect dinamic
delete plista;
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

Constructori i destructori
29

1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::

Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


30

Exemplul urmator prezinta o clasa sir care


defineste functii membre de comparare a doua
siruri, dintre care una din ele va fi rescrisa.
In acest exemplu, singura data de tip private
este pointerul la un sir de caractere *text.
Constructorul sir i funcia compar() sunt
declarate n cadrul clasei, pe cnd destructorul
~sir i funcia denumit afiseaza() sunt definite
n mod inline.

Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


31

Functia compar() este redefinita. Ea are


doua sabloane (prototipuri):
Primul

sablon este utilizat cand se compara


doua siruri de lungimi diferite,
iar al doilea cand se compara numai primele
numarcar caractere ale acestora.

Notatiile sir &sir1 si sir &sir2


reprezinta referintelor celor doua siruri ce
trebuie comparate.
Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


32

Functia compar() ntoarce un rezultat


de tip ntreg, astfel nct:
prima definitie a functiei compara doua
siruri de lungime diferita,
iar cea de-a doua compara primele
numarcar caractere din cele doua siruri.

Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


33

Valoarea compararii cu functiile specializate


strcmp() si strncmp() se obtine prin scaderea
nedistructiva a caracterelor celor doua functii
aflate pe acceasi pozitie relativa.
Se pot obtine urmatoarele valori:

Daca s1 < s2 atunci rezultatul este <0


Daca s1 = s2 atunci rezultatul este =0
Daca s1 > s2 atunci rezultatul este >0

Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


34

#include<iostream.h>
#include<string.h>
#include<stdio.h>

class sir{
// declaratie de tip privat
char *text;

Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


35

public:
// declaratii de tip public
sir(char *sirul);
// constructor
~sir(){
delete text; }
// destructor
int compar(sir &s1, sir &s2); // functia membra
compar va fi redefinita
int compar(sir &s1, sir &s2, unsigned int
numarcar);
void afiseaza(char *mesaj=" ")
{
cout<<mesaj<<text<<endl;
}
};
Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


36

// definirea constructorului
sir::sir(char *sirul)
{
text= new char[strlen(sirul)];
strcpy(text,sirul);
}
int sir::compar(sir &s1, sir &s2)
{
return strcmp(s1.text, s2.text);
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


37

int sir::compar(sir &s1,sir &s2, unsigned int numarcar)


{
return strncmp(s1.text, s2.text, numarcar);
}
int main(void)
{
sir sir1("abcd"), sir2("abcdef");
sir1.afiseaza("Primul sir este: ");
sir2.afiseaza("Al doilea sir este: ");
int rezultat1, rezultat2;
rezultat1=sir1.compar(sir1,sir2);
cout<<"Rezultatul compararii este: "<<rezultat1<<endl;
rezultat2 = sir1.compar(sir1,sir2,4);
cout<<"Rezultatul compararii este: "<<rezultat2<<endl;
}
Programare orientat pe obiecte (C++/Java)

14.10.2013

3. Redefinirea funciilor membre


38

Rezultatul execuiei este:

Programare orientat pe obiecte (C++/Java)

14.10.2013

Constructori i destructori
39

1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::

Programare orientat pe obiecte (C++/Java)

14.10.2013

4. Operatorul de rezoluie
40

Definirea funciilor dintr-o clas se face


n afara domeniului de definiie al clasei, i
de aceea numele funciei trebuie s fie
nsoit de numele clasei, i s fie separat de
aceasta prin operatorul de rezoluie sau
vizibilitate ( :: ).

Programare orientat pe obiecte (C++/Java)

14.10.2013

4. Operatorul de rezoluie
41

Exemplu de implementare a unei clase:


Definii i implementai clasa
Cilindru, avnd ca date membru:
Raza i Inaltimea cilindrului
i ca funcii membre:
un

constructor
Aria
Volum

Programare orientat pe obiecte (C++/Java)

14.10.2013

4. Operatorul de rezoluie
42

#include<iostream.h>
#define
PI
3.14
class cilindru
{
float raza;
float inaltimea;

Programare orientat pe obiecte (C++/Java)

14.10.2013

4. Operatorul de rezoluie
43

public:
cilindru();
float aria();
float aria_totala();
float volum();
};

Programare orientat pe obiecte (C++/Java)

14.10.2013

4. Operatorul de rezoluie
44

cilindru::cilindru()
{
cout<<"Dati raza cilindrului
= "; cin>>raza;
cout<<"Dati inaltimea cilindrului = ";
cin>>inaltimea;
}

float cilindru::aria()
{
return ( 2 * PI * raza * inaltimea );
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

4. Operatorul de rezoluie
45

float cilindru::aria_totala()
{
float a;
a = aria();
return( a + 2 * PI * raza * raza );
}
float cilindru::volum()
{
return ( PI * raza * raza * inaltimea );
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

4. Operatorul de rezoluie
46

int main(void)
{
cilindru c;
cout<<"Aria cilindrului este = "<<c.aria()<<endl;
cout<<"Aria totala este
=
"<<c.aria_totala()<<endl;
cout<<"Volumul cilindrului este =
"<<c.volum()<<endl;
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

Probleme propuse spre rezolvare


47

1. Definii i implementai clasa Cerc, avnd ca dat


membr Raza, un constructor i ca funcii membre
Aria i Circumferinta.
2. Definii i implementai clasa Dreptunghi, avnd
ca date membre Latime i Lungime i ca funcii
membre: un constructor, Perimetru i Aria.

Programare orientat pe obiecte (C++/Java)

14.10.2013

Solutie problema 1:
48

#include<iostream.h>
#define PI 3.14
class cerc{
float raza;
public:
cerc();
float aria();
float circumferinta();
};

Programare orientat pe obiecte (C++/Java)

14.10.2013

cerc::cerc()
{
49
cout<<"Raza cercului este = ";
cin>>raza;
}
float cerc::aria()
{
return (PI*raza*raza);
}
float cerc::circumferinta()
{
return (2*PI*raza);
}
Programare orientat pe obiecte (C++/Java)

14.10.2013

50

int main(void)
{
cerc c;
cout<<"Aria cercului este = "<< c.aria()
<<endl;
cout<<"Circumferinta cercului este = "<<
c.circumferinta() <<endl;
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

Solutie problema 2:
51

#include<iostream.h>

class dreptunghi{
float latime;
float lungime;
public:
dreptunghi();
float perimetru();
float aria ();
};

Programare orientat pe obiecte (C++/Java)

14.10.2013

dreptunghi:: dreptunghi()
{
52
cout<<"Dati latimea dreptunghilui
= ";
cin>>latime;
cout<<"Dati lungimea dreptunghilui = ";
cin>>lungime;
}
float dreptunghi::perimetru()
{
return (2*(latime+lungime));
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

float dreptunghi::aria()
{
53
return(latime*lungime);
}

int main(void)
{
dreptunghi d;
cout<<Perimetru dreptunghilui este =
<< d.perimetru()<<endl;
cout<<"Aria este = "<< d.aria()<<endl;
}

Programare orientat pe obiecte (C++/Java)

14.10.2013

54

ntrebri?

Programare orientat pe obiecte (C++/Java)

14.10.2013