Sunteți pe pagina 1din 52

LECTOR DR.

ADRIAN RUNCEANU
Programare orientat pe
obiecte
Universitatea Constantin Brncui din Trgu-Jiu
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
Curs 2
Constructori i destructori
11.10.2012
Programare orientat pe obiecte (C++/Java)
2
Constructori i destructori
1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::
11.10.2012
Programare orientat pe obiecte (C++/Java)
3
1. Definiii
Pentru crearea, initializarea, copierea si
distrugerea obiectelor, in C++ se folosesc functii
membre speciale, numite constructori si
destructori:

Functia de tip constructor se apeleaza automat la
crearea fiecarui obiect al clasei, creare care poate fi
statica sau dinamica (folosind operatorul new).
Functia de tip destructor se apeleaza automat la
eliminarea unui obiect al clasei, la incheierea
timpului de viata sau, in cazul variabilelor
dinamice, este solicitat prin program (cu operatorul
delete).
11.10.2012
Programare orientat pe obiecte (C++/Java)
4
1. Definiii
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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
5
1. Definiii
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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
6
1. Definiii
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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
7
Constructori i destructori
1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::
11.10.2012
Programare orientat pe obiecte (C++/Java)
8
2. Crearea, iniializarea i eliminarea
obiectelor
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
11.10.2012
Programare orientat pe obiecte (C++/Java)
9
2. Crearea, iniializarea i eliminarea
obiectelor
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
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
11.10.2012
Programare orientat pe obiecte (C++/Java)
10
2. Crearea, iniializarea i eliminarea
obiectelor
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

11.10.2012
Programare orientat pe obiecte (C++/Java)
11
2. Crearea, iniializarea i eliminarea
obiectelor
public:
// declaratii de tip public
// functii inline
fifo()
{
nrcrt=prim=0 ;
cout<<Constructor fifo<<endl;
}
~fifo()
{
cout<<Destructor fifo<<endl;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
12
2. Crearea, iniializarea i eliminarea
obiectelor
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
};
11.10.2012
Programare orientat pe obiecte (C++/Java)
13
2. Crearea, iniializarea i eliminarea
obiectelor
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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
14
2. Crearea, iniializarea i eliminarea
obiectelor
Se poate executa urmatorul program care sa
contina clasa fifo si care sa aiba doar declaratia unei
variabile si functia principala, astfel:


Executia programului va avea ca efect,
urmatoarele afisari:


Chiar daca functia main() este vida, conform
definitiei unei clase, se obtine un astfel de rezultat.
11.10.2012
Programare orientat pe obiecte (C++/Java)
15
fifo lista;
int main()
{}
Constructor fifo
Destructor fifo
2. Crearea, iniializarea i eliminarea
obiectelor
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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
16
2. Crearea, iniializarea i eliminarea
obiectelor
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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
17
2. Crearea, iniializarea i eliminarea
obiectelor

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:
11.10.2012
Programare orientat pe obiecte (C++/Java)
18
2. Crearea, iniializarea i eliminarea
obiectelor
#include<iostream.h>
//lista FIFO cu nmax numere de elemente
class fifo{
// declaratii de tip privat
int nmax; // dimensiunea listei
int *tab; // adresa tabloului listei
int nrcrt; // numarul curent de elemente din lista
int prim; // primul element din lista
11.10.2012
Programare orientat pe obiecte (C++/Java)
19
2. Crearea, iniializarea i eliminarea
obiectelor
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
// 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
}
};
11.10.2012
Programare orientat pe obiecte (C++/Java)
20
2. Crearea, iniializarea i eliminarea
obiectelor
// 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 "<<endl;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
21
2. Crearea, iniializarea i eliminarea
obiectelor
//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"<<endl;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
22
2. Crearea, iniializarea i eliminarea
obiectelor
//destructor
fifo::~fifo()
{
cout<<"Destructor, lista de "<<nmax<<"
elemente"<<endl;
delete tab;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
23
2. Crearea, iniializarea i eliminarea
obiectelor
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"<<endl;
return 1;
}
else
{
cout<<"Lista este plina"<<endl;
return 0;
}
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
24
2. Crearea, iniializarea i eliminarea
obiectelor
int fifo::extrag(int &k)
{
if(lista_vida())
{
k=tab[prim];
prim=(prim+1)%nmax;
nrcrt--;
cout<<"Lista mai are "<<nrcrt<<" elemente"<<endl;
return 1;
}
else
{
cout<<"Lista este vida"<<endl;
return 0;
}
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
25
2. Crearea, iniializarea i eliminarea
obiectelor
int main(void)
{
int k,i;
fifo *plista; // declaratia unui pointer la lista
plista=new fifo(20); //creare obiect dinamic
delete plista;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
26
Constructori i destructori
1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::
11.10.2012
Programare orientat pe obiecte (C++/Java)
27
3. Redefinirea funciilor membre
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 si functia compar() sunt
numai declarate in cadrul clasei, pe cand
destructorul ~sir si functia denumita afiseaza()
sunt definite in mod inline.
11.10.2012
Programare orientat pe obiecte (C++/Java)
28
3. Redefinirea funciilor membre
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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
29
3. Redefinirea funciilor membre

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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
30
3. Redefinirea funciilor membre
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
11.10.2012
Programare orientat pe obiecte (C++/Java)
31
3. Redefinirea funciilor membre
#include<iostream.h>
#include<string.h>
#include<stdio.h>

class sir{
// declaratie de tip privat
char *text;
11.10.2012
Programare orientat pe obiecte (C++/Java)
32
3. Redefinirea funciilor membre
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;
}
};
11.10.2012
Programare orientat pe obiecte (C++/Java)
33
3. Redefinirea funciilor membre
// 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);
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
34
3. Redefinirea funciilor membre
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;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
35
3. Redefinirea funciilor membre
Rezultatul execuiei este:
11.10.2012
Programare orientat pe obiecte (C++/Java)
36
Constructori i destructori
1. Definiii
2. Crearea, iniializarea i
eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::
11.10.2012
Programare orientat pe obiecte (C++/Java)
37
4. Operatorul de rezoluie

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 ( :: ).
11.10.2012
Programare orientat pe obiecte (C++/Java)
38
4. Operatorul de rezoluie
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
11.10.2012
Programare orientat pe obiecte (C++/Java)
39
4. Operatorul de rezoluie
#include<iostream.h>
#define PI 3.14
class cilindru
{
float raza;
float inaltimea;
11.10.2012
Programare orientat pe obiecte (C++/Java)
40
4. Operatorul de rezoluie

public:
cilindru();
float aria();
float aria_totala();
float volum();
};
11.10.2012
Programare orientat pe obiecte (C++/Java)
41
4. Operatorul de rezoluie
cilindru::cilindru()
{
cout<<"Dati raza cilindrului = "; cin>>raza;
cout<<"Dati inaltimea cilindrului = ";
cin>>inaltimea;
}

float cilindru::aria()
{
return ( 2 * PI * raza * inaltimea );
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
42
4. Operatorul de rezoluie
float cilindru::aria_totala()
{
float a;
a = aria();
return( a + 2 * PI * raza * raza );
}

float cilindru::volum()
{
return ( PI * raza * raza * inaltimea );
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
43
4. Operatorul de rezoluie
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;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
44
Probleme propuse spre rezolvare

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.
11.10.2012
Programare orientat pe obiecte (C++/Java)
45
Solutie problema 1:


#include<iostream.h>
#define PI 3.14
class cerc{
float raza;
public:
cerc();
float aria();
float circumferinta();
};
11.10.2012
Programare orientat pe obiecte (C++/Java)
46
cerc::cerc()
{
cout<<"Raza cercului este = ";
cin>>raza;
}
float cerc::aria()
{
return (PI*raza*raza);
}
float cerc::circumferinta()
{
return (2*PI*raza);
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
47



int main(void)
{
cerc c;
cout<<"Aria cercului este = "<< c.aria()
<<endl;
cout<<"Circumferinta cercului este = "<<
c.circumferinta() <<endl;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
48
Solutie problema 2:

#include<iostream.h>
class dreptunghi{
float latime;
float lungime;
public:
dreptunghi();
float perimetru();
float aria ();
};
11.10.2012
Programare orientat pe obiecte (C++/Java)
49
dreptunghi:: dreptunghi()
{
cout<<"Dati latimea dreptunghilui = ";
cin>>latime;
cout<<"Dati lungimea dreptunghilui = ";
cin>>lungime;
}

float dreptunghi::perimetru()
{
return (2*(latime+lungime));
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
50
float dreptunghi::aria()
{
return(latime*lungime);
}

int main(void)
{
dreptunghi d;
cout<<Perimetru dreptunghilui este =
<< d.perimetru()<<endl;
cout<<"Aria este = "<< d.aria()<<endl;
}
11.10.2012
Programare orientat pe obiecte (C++/Java)
51
ntrebri?
11.10.2012
Programare orientat pe obiecte (C++/Java)
52

S-ar putea să vă placă și