curs5-poo(2012)
TRANSCRIPT
-
LECTOR DR. ADRIAN RUNCEANU
Programare orientat pe
obiecte
Universitatea Constantin Brncui din Trgu-Jiu Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
-
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
2
Curs 5 Suprancrcarea operatorilor
(partea II)
-
Curs 5
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
3
1. Suprancrcarea operatorului de atribuire (=)
2. Suprancrcarea operatorului de indexare ([ ])
3. Suprancrcarea operatorului apel de funcie (( ))
4. Suprancrcarea operatorilor new i delete
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
4
Atunci cand se utilizeaza operatorul =, fara supraincarcare, se realizeaza o copiere bit cu bit.
Aceasta nu inseamna, ca intotdeauna obtinem rezultatele dorite.
Acest lucru se intampla, deoarece cele doua obiecte care formeaza atribuirea:
ex. a = b, primesc aceeasi adresa.
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
5
In cazul in care obiectul b se distruge, atunci, obiectul a va avea o adresa spre un obiect care nu mai exista.
Pentru a putea inlatura acest neajuns, trebuie sa suprancrcm operatorul =.
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
6
Operatorul = este binar. Dac acesta este suprancrcat
prin utilizarea unei funcii membru, atunci primul operand este obiectul curent, iar al doilea operand este parametrul funciei.
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
7
Limbajul C++ permite programatorului s defineasc diverse operaii cu obiecte ale claselor, folosind simbolurile operatorilor standard.
Un tip clas se poate defini mpreun cu un set de operatori asociai, obtinui prin suprancrcarea operatorilor existeni.
n acest fel, se efectueaz operaii specifice cu noul tip la de simplu ca i n cazul tipurilor standard.
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
8
Exemplu
Considerm clasa sir, n care fiecare obiect reine adresa unui ir de caractere.
Astfel, data membru adr reine adresa unui pointer ctre ir, iar irul va fi alocat dinamic cu ajutorul operatorului new ntr-o zon de memorie disponibil.
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
9
Clasa va avea: 1. un constructor care aloc spaiu de
memorie pentru irul de caractere 2. un destructor care elibereaz zona de
memorie alocat unui ir de caractere 3. o metod afis() folosit pentru afiarea
irului 4. i o metod de copiere realizat prin
suprancrcarea operatorului =
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
10
Aceast metod are rolul ca la o atribuire a = b, unde a i b sunt obiecte de tip ir: 1. s elibereze memoria reinut de irul de caractere a
crui adres o conine data membru adr a lui a 2. s aloce spaiu pentru irul reinut de b 3. s copieze irul reinut de b n acest spaiu de memorie
Dup aceast operaie, irul care era iniial reinut numai b este alocat n dou locuri diferite n memoria disponibil, iar pointerii ctre cele doua locuri sunt reinui de datele membru ale obiectelor a i b.
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
11
#include #include class sir{ char *adr; public: sir(char s[]); ~sir(); void afis(); void operator=(sir& sirul); };
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
12
sir::sir(char s[ ])
{
cout
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
13
void sir::afis() { cout
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
14
int main(void) { sir s("un sir"), t("alt sir"); s.afis(); t.afis(); s = t; t.~sir(); s.afis(); cout
-
1. Suprancrcarea operatorului de atribuire(=)
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
15
Dupa executia programului se va afisa:
-
Curs 5
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
16
1. Suprancrcarea operatorului de atribuire(=)
2. Suprancrcarea operatorului de indexare ([ ])
3. Suprancrcarea operatorului apel de funcie(( ))
4. Suprancrcarea operatorilor new i delete
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
17
Operatorul de indexare [ ] este binar i are forma:
expresie_1[expresie_2] Pentru suprancrcarea acestui operator trebuie s folosim o funcie operator[ ], care trebuie s fie membr a clasei, s fie nestatic i s aib forma:
x[n] sau x.operator[ ] (n) Al doilea operand, care are rolul indexului,
poate fi la suprancrcare de orice tip.
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
18
Exemplu 2:
Programul urmtor ilustreaz un mod de utilizare a operatorului [ ].
Ideea programului este aceea de a crea un tablou de nregistrri care conine informaii de tip medical despre persoane.
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
19
Se dorete accesul la nregistrri ct mai uor posibil, n mai multe moduri:
dup nume dup greutate dup numrul de ordine
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
20
n prima cutare, pentru a face ct mai uor accesul la nregistrri dup numele persoanelor, se va face suprancrcarea operatorului de indexare [ ] avnd ca parametru un ir de caractere care indic numele persoanei cutate.
n al doilea caz, pentru a face ct mai uor accesul la nregistrri dup greutatea persoanei, vom face suprancrcarea operatorului de indexare avnd ca parametru de tip float care indic greutatea persoanei cutate.
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
21
#include #include class analize; // a doua clasa class pers { // datele personale char nume[35]; double greutate; int varsta; friend analize; // a doua clasa public: // functii de introducere persoane si tiparire void init(char *s, double gr, int v); void tipar(); };
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
22
void pers::init(char *s, double gr, int v) { strcpy(nume, s); greutate=gr; varsta=v; } void pers::tipar() { if(*this) cout
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
23
// definim clasa care contine analizele mai multor persoane
class analize { pers *sir; int n; public: // definire constructori analize() { n=5; sir=new pers[5]; } analize(int nr) { n=nr; cout
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
24
// supraincarcare operatori
void introd(); pers *operator[] (char *); pers *operator[] (double); pers *operator[] (int); };
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
25
void analize::introd()
{
for(int i=0;i
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
26
//supraincarcare pentru a permite cautarea inregistrarilor
dupa nume
pers *analize::operator[ ] (char *nume)
{
for(int i=0;i
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
27
//supraincarcare pentru a permite cautarea inregistrarilor dupa greutate
pers *analize::operator[] (double g) { for(int i=0;i
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
28
pers *analize::operator[] (int index) { if(index
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
29
int main(void) { char c; int nr; coutnr; analize t(nr); t.introd(); while(1) { coutc;
-
2. Suprancrcarea operatorului de indexare ([ ])
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
30 switch(c)
{ case 'g' : double g;
coutg;
t[g]->tipar();
break;
case 'n' : char n[100];
coutn;
t[n]->tipar();
break;
case 'i' : int i;
couti;
t[i]->tipar();
break;
case 'e': return;
}
}
}
-
Curs 5
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
31
1. Suprancrcarea operatorului de atribuire(=)
2. Suprancrcarea operatorului de indexare ([ ])
3. Suprancrcarea operatorului apel de funcie(( ))
4. Suprancrcarea operatorilor new i delete
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
32
Cnd este realizat suprancrcarea operatorului apel de funcie, aceasta nu va nsemna o nou variant de suprancrcare a unei funcii, ci suprancrcarea unui operator binar nestatic de forma:
expresie (lista_expresii);
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
33
Mentionam specificul utilizarii acestei functii operator:
evaluarea si verificarea listei de argumente se face intocmai ca pentru o functie obisnuita
chiar daca operatorul este binar, functia operator poate avea oricate argumente
Acesta deoarece al doilea argument este considerat o lista de argumente.
Atunci cand lista de parametrii este vida, al doilea argument poate lipsi.
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
34
Exemplu 3:
Acest exemplu foloseste operatorul () pentru parcurgerea unei liste simple.
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
35
#include
#include
struct elem{
int inf;
elem *adr;
// se initializeaza camp inf cu n
elem(int n, struct elem *p): inf(n),
adr(p){}
};
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
36
class list{ elem *prim,*p; public: // functie de afisare element curent void afispoz() { cout
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
37
//crearea listei care va avea un numar dat de elemente
list(int); // supraincarcarea operatorului realizeaza pozitionarea la
nodul urmator //Daca pozitia curenta este la sfarsitul listei, atunci nodul
urmator va fi primul element al listei
elem *operator() (); // supraincarcarea operatorului determina avansarea nodului
curent cu un numar dat de pozitii
elem *operator() (int); };
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
38
list::list(int nr)
{
int inf;
if(nr
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
39
elem *list::operator() () { elem *poz=p; poz = (p->adr != NULL) ? p->adr+1 : prim; return p=poz; }
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
40
elem *list::operator() (int nr) { for(int i=1;i
-
3. Suprancrcarea operatorului apel de functie - ()
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
41
int main() { list l(6); l(); l.afispoz(); l(2); l.afispoz(); }
-
Curs 5
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
42
1. Suprancrcarea operatorului de atribuire(=)
2. Suprancrcarea operatorului de indexare ([ ])
3. Suprancrcarea operatorului apel de funcie(( ))
4. Suprancrcarea operatorilor new i delete
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
43
Funciile operator new i delete pot fi suprancrcate de ctre utilizator cu condiia ca acestea s fie membre ale clasei.
Ele sunt n mod implicit de tip static. Funcia operator new are ca parametru
tipul size_t i ntoarce un pointer de tip void coninnd adresa zonei alocate.
Ea are prototipul: void *operator new(size_t);
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
44
Indicarea tipului size_t este obligatorie in C++ chiar daca tipul size_t este echivalent cu tipul unsigned int.
Operatorul new suprancrcat pastreaza proprietatea de a apela intotdeauna constructorul clasei dupa alocarea dinamica a obiectului.
Calculul dimensiunii zonei de memorie si generarea obiectului raman in sarcina compilatorului.
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
45
Functia operator delete trebuie sa primeasca ca parametru un pointer de tipul clasei asociate sau pointer la void, continand adresa obiectului ce va eliminat.
Functia nu intoarce nici o valoare. Are prototipul:
void *operator delete(void *);
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
46
Operatorul delete suprancrcat pastreaza proprietatea de a apela intotdeauna destructorul clasei inainte de a elibera memoria alocata dinamic obiectului.
Utilizarea versiunilor standard new si delete se poate face cu ajutorul operatorului de rezolutie (::).
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
47
Exemplu 4: Exemplu de suprancrcare a operatorilor new
si delete: #include class exemplu { int a, b, c; static short l;
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
48
public: exemplu() { cout
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
49
void *operator delete(void *p) { cout
-
4. Suprancrcarea operatorilor new i delete
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
50
Importanta practica a redefinirii operatorilor new si delete este subliniata in urmatoarele doua idei:
Se pot gestiona mult mai bine alocarile, verificarile si setarile speciale in cazul datelor alocate prin intermediul lor;
O utilizare speciala poate fi aceea in care dupa epuizarea memoriei speciale de tip heap, se poate face alocarea in alte zone de memorie (un fisier de pe disc poate fi folosit ca memorie virtuala in acest caz).
-
27.10.2012 Curs - Programare orientat pe obiecte C++/Java
51
ntrebri?