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
14.10.2013

Programare orientat pe obiecte (C++/Java)

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);
lista este vida //daca nrcrt=0 atunci

} 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; }
14.10.2013

Programare orientat pe obiecte (C++/Java)

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:
#include<iostream.h>
51

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