Programare orientată perunceanu.utgjiu.ro/.../fetch.php?media=docs:cursuri:curs2-poo_2012_.pdf ·...
Transcript of Programare orientată perunceanu.utgjiu.ro/.../fetch.php?media=docs:cursuri:curs2-poo_2012_.pdf ·...
LECTOR DR. ADRIAN RUNCEANU
Programare orientată pe
obiecte
Universitatea “Constantin Brâncuşi” din Târgu-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. Definiţii
2. Crearea, iniţializarea şi eliminarea obiectelor
3. Redefinirea funcţiilor membre
4. Operatorul de rezoluţie “::”
11.10.2012 Programare orientată pe obiecte (C++/Java)
3
1. Definiţii
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. Definiţii
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. Definiţii
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. Definiţii
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. Definiţii
2. Crearea, iniţializarea şi eliminarea obiectelor
3. Redefinirea funcţiilor membre
4. Operatorul de rezoluţie “::”
11.10.2012 Programare orientată pe obiecte (C++/Java)
8
2. Crearea, iniţializarea şi eliminarea obiectelor
Prezentăm î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 funcţii care asigură următoarele operaţii specifice:
iniţializarea listei
adăugarea(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, iniţializarea şi eliminarea obiectelor
Astfel, structura de date, împreună cu metodele de operare asociate reprezintă un ansamblu cu o funcţionalitate bine definită.
Clasa conţine câmpurile: tab[100] - un vector definit static care conţine elementele listei nrcrt - numărul curent(actual) de elemente aflate la un moment dat
în lista prim - un număr care reprezintă poziţia primului element din lista funcţia init() - introduce o valoare de pornire pentru fiecare din cele
două variabile specifice, nrcrt respectiv prim funcţia adaug() - adaugă un element în listă funcţia extrag() - extrage un element din listă funcţia lista_vida() - returnează 0 dacă lista este vidă, sau 1 în caz
contrar funcţia 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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea şi eliminarea obiectelor
În exemplul următor se reia declaraţia clasei fifo, pentru a obţine 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, iniţializarea şi eliminarea obiectelor
Se fac următoarele modificări : se elimină funcţia 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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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, iniţializarea ş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. Definiţii
2. Crearea, iniţializarea şi eliminarea obiectelor
3. Redefinirea funcţiilor membre
4. Operatorul de rezoluţie “::”
11.10.2012 Programare orientată pe obiecte (C++/Java)
27
3. Redefinirea funcţiilor 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 funcţiilor 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 funcţiilor membre
Functia compar() întoarce un rezultat de tip întreg, astfel încât:
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 funcţiilor 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 funcţiilor 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 funcţiilor 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 funcţiilor 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 funcţiilor 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 funcţiilor membre
Rezultatul execuţiei este:
11.10.2012 Programare orientată pe obiecte (C++/Java)
36
Constructori şi destructori
1. Definiţii
2. Crearea, iniţializarea şi eliminarea obiectelor
3. Redefinirea funcţiilor membre
4. Operatorul de rezoluţie “::”
11.10.2012 Programare orientată pe obiecte (C++/Java)
37
4. Operatorul de rezoluţie
Definirea funcţiilor dintr-o clasă se face în afara domeniului de definiţie al clasei, și de aceea numele funcţiei trebuie să fie însoţit de numele clasei, şi să fie separat de aceasta prin operatorul de rezoluţie sau vizibilitate ( :: ).
11.10.2012 Programare orientată pe obiecte (C++/Java)
38
4. Operatorul de rezoluţie
Exemplu de implementare a unei clase:
Definiţi şi implementaţi clasa Cilindru, având ca date membru:
Raza şi Inaltimea cilindrului
şi ca funcţii membre: un constructor
Aria
Volum
11.10.2012 Programare orientată pe obiecte (C++/Java)
39
4. Operatorul de rezoluţie
#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 rezoluţie
public: cilindru(); float aria(); float aria_totala(); float volum(); };
11.10.2012 Programare orientată pe obiecte (C++/Java)
41
4. Operatorul de rezoluţie
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 rezoluţie
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 rezoluţie
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. Definiţi şi implementaţi clasa Cerc, având ca dată membră Raza, un constructor şi ca funcţii membre Aria şi Circumferinta.
2. Definiţi şi implementaţi clasa Dreptunghi, având ca date membre Latime şi Lungime şi ca funcţii 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
Întrebări?
11.10.2012 Programare orientată pe obiecte (C++/Java)
52