Programare orientata pe obiecte - curs

41
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

Transcript of Programare orientata pe obiecte - curs

Page 1: Programare orientata pe obiecte - curs

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

Page 2: Programare orientata pe obiecte - curs

24.10.2013 Programare orientată pe obiecte C++/Java

2

Curs 4 Supraîncărcarea operatorilor

(partea I)

Page 3: Programare orientata pe obiecte - curs

Curs 4

24.10.2013 Programare orientată pe obiecte C++/Java

3

1. Supraîncărcarea operatorilor 2. Modalităţi de supraîncărcare a

operatorilor 2.1. Supraîncărcarea operatorilor

folosind funcţii membre 2.2. Supraîncărcarea operatorilor

folosind funcţii prietene (friends)

Page 4: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

4

Operatorii sunt notaţii concise, infixate, pentru operaţii matematice uzuale.

Limbajul C++, ca orice limbaj de programare

asigură un set de operatori pentru tipurile primitive.

În plus, faţă de limbajul C, C++ oferă

posibilitatea asocierii operatorilor existenţi cu tipurile definite de utilizator.

Page 5: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

5

Astfel, prezintă interes extinderea operatorilor:

în aritmetică complexă în algebra matricială în lucrul cu şiruri de caractere, etc Un operator poate fi privit ca o funcţie, în care

termenii sunt argumentele funcţiei: în lipsa operatorului + expresia a+b s-ar calcula apelând funcţia aduna(a,b)

Page 6: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

6

Limbajul C++ introduce următorii operatori noi:

1. new şi 2. delete - pentru gestiunea memoriei

dinamice 3. operatorul de rezoluţie (::) şi 4. operatorii de acces la membri: .* şi ->*.

Page 7: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

7

Limbajul C++ permite programatorului să definească diverse operații cu obiecte ale claselor, folosind simbolurile operatorilor standard.

Un tip clasă se poate defini împreună cu un set de operatori asociați, obtinuți prin supraîncărcarea (overloading) operatorilor existenți.

În acest fel, se efectuează operații specifice cu noul tip la fel de simplu ca în cazul tipurilor standard.

Page 8: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

8

Procedeul constă în definirea unei funcții cu numele:

operator simbol unde: operator este cuvântul cheie dedicat simbol este simbolul oricărui operator

C++, mai puțin următoriii: “.”, “*”, “::”, “?:”, “sizeof”.

Page 9: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

9

Vom evita folosirea termenului redefinire, căruia îi vom da o semnificaţie diferită, în contextul moştenirii.

Anumiţi operatori pot fi utilizaţi cu orice tip de termeni (sunt deja supraîncărcaţi global de către compilator).

Page 10: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

10

Aceştia sunt: new delete sizeof :: = & ->* .* . ->

Page 11: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

11

Pot fi supraîncărcaţi următorii operatori:

+ *= ->

- %= <<

* ^= >>

/ |= []

% >>= ()

^ <<= new

& == new{}

| != delete

~ <= delete[]

! >=

= &&

< ++

> --

+= ->*

-= ,

Page 12: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

12

Nu pot fi supraîncărcaţi operatorii: :: . .* ?: sizeof

Page 13: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

13

Reguli pentru supraîncărcare: Setul de operatori ai limbajul C++ nu poate fi

extins prin asocierea de semnificaţii noi unor caractere, care nu sunt operatori (de exemplu nu putem defini operatorul „**”).

Prin supraîncărcarea unui operator nu i se poate modifica aritatea (astfel operatorul “!” este unar şi poate fi supraincarcat numai ca operator unar). De asemeni asociativitatea şi precedenţa operatorului se menţin.

Page 14: Programare orientata pe obiecte - curs

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

14

La supraîncărcarea unui operator nu se pot specifica argumente cu valori implicite.

Operatorii supraîncărcaţi într-o clasă sunt moşteniţi în clasele derivate (excepţie face operatorul de atribuire „=”).

Page 15: Programare orientata pe obiecte - curs

Curs 4

24.10.2013 Programare orientată pe obiecte C++/Java

15

1. Supraîncărcarea operatorilor 2. Modalităţi de supraîncărcare a

operatorilor 2.1. Supraîncărcarea operatorilor

folosind funcţii membre 2.2. Supraîncărcarea operatorilor

folosind funcţii prietene (friends)

Page 16: Programare orientata pe obiecte - curs

2. Modalităţi de supraîncărcare a operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

16

Exemple:

Pentru exemplificare, folosim tot tipul abstract complex definit în cursul anterior și supraîncărcăm:

operatorul “+” pentru a putea aduna două numere complexe

operatorul “-” pentru a putea scădea două numere complexe

Page 17: Programare orientata pe obiecte - curs

2. Modalităţi de supraîncărcare a operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

17

Funcțiile operator+() si operator-() trebuie să primească câte doi parametri de tip complex și să returneze un rezultat de tip complex și trebuie să aibă acces la datele clasei complex.

Acest lucru se poate realiza în două moduri:

1. ca funcții membre ale clasei complex 2. ca funcții prietene ale clasei complex

Page 18: Programare orientata pe obiecte - curs

Curs 4

24.10.2013 Programare orientată pe obiecte C++/Java

18

1. Supraîncărcarea operatorilor 2. Modalităţi de supraîncărcare a

operatorilor 2.1. Supraîncărcarea operatorilor

folosind funcţii membre 2.2. Supraîncărcarea operatorilor

folosind funcţii prietene (friends)

Page 19: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

19

O funcție membră primește în mod implicit adresa obiectului pentru care este apelată.

Funcția operator+() va avea prototipul: complex operator+(complex);

Expresia x + y, unde x și y sunt de tipul complex, va fi interpretată de compilator ca un apel:

x.complex+(y)

Page 20: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

20

Funcția operator-() va avea prototipul:

complex operator-(complex); Expresia x - y, unde x și y sunt de tipul

complex, va fi interpretată de compilator ca un apel:

x.complex-(y)

Page 21: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

21

Programul următor prezintă o variantă mai simplă a clasei complex, cu operatorii “+” și “-” supraîncărcați:

#include<iostream.h> class complex { // date membru protejate(private)

double real; double imag;

Page 22: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

22

// funcții membru neprotejate

public: // constructor folosit la inițializare

complex(double x=0, double y=0); void afiscomplex(); complex operator+(complex); complex operator-(complex); };

Page 23: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

23

complex::complex(double x, double y) { real=x; imag=y; } void complex::afiscomplex() { cout<<real<<" + i * "<<imag; }

Page 24: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

24

complex complex::operator+(complex x) { complex z; z.real = real + x.real; z.imag = imag + x.imag; return z; }

Page 25: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

25

complex complex::operator-(complex x) { complex z; z.real = real - x.real; z.imag = imag - x.imag; return z; }

Page 26: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

26

int main(void) { double x, y; cout<<"Dati primul numar complex\n"; cout<<"Partea reala = "; cin>>x; cout<<"Partea imaginara = "; cin>>y; complex z1(x,y); z1.afiscomplex();

Page 27: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

27

cout<<"Dati al doilea numar complex\n";

cout<<"Partea reala = "; cin>>x; cout<<"Partea imaginara = "; cin>>y; complex z2(x,y); z2.afiscomplex();

Page 28: Programare orientata pe obiecte - curs

2.1 Supraîncărcarea operatorilor folosind funcţii membre

24.10.2013 Programare orientată pe obiecte C++/Java

28

complex t1, t2; t1 = z1 + z2; cout<<"\nSuma celor doua nr. complexe"; t1.afiscomplex(); t2 = z1 - z2; cout<<"\nDiferenta celor doua nr.

complexe"; t2.afiscomplex(); }

Page 29: Programare orientata pe obiecte - curs

Curs 4

24.10.2013 Programare orientată pe obiecte C++/Java

29

1. Supraîncărcarea operatorilor 2. Modalităţi de supraîncărcare a

operatorilor 2.1. Supraîncărcarea operatorilor

folosind funcţii membre 2.2. Supraîncărcarea operatorilor

folosind funcţii prietene (friends)

Page 30: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

30

Funcții prietene (friend) Există posibilitatea ca anumite funcții,

care nu aparțin unei clase să poată accesa datele private ale acesteia, caz în care funcțiile respective se numesc “funcții prietene”.

Page 31: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

31

Pentru a atașa unei clase o funcție prieten introducem în interiorul definiției sale prototipul funcției prieten, precedat de cuvântul cheie friend.

O funcție prieten nu poate accesa datele direct, așa cum poate o metodă a clasei respective, ci prin intermediul parametrului de tip obiect transmis.

Page 32: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

32

În C++ operatorii pot fi supraîncărcaţi prin funcţii prieten.

Revenind la exemplul cu clasa complex, putem adauga funcția prietenă operator*() care are următorul prototip: complex operator*(complex, complex)

Expresia x * y va fi interpretată de către compilator ca un apel al funcției

operator*(x, y) care este perfect echivalentă.

Page 33: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

33

Exemplul următor prezintă acest tip de supraîncărcare a operatorilor “*” și “/”:

#include<iostream.h> class complex { // date membru protejate(private)

double real; double imag;

Page 34: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

34

// funcții membru neprotejate

public: // constructor folosit la inițializare

complex(double x=0,double y=0); void afiscomplex(); // prototipul funcțiilor prietene

friend complex operator*(complex, complex); friend complex operator/(complex, complex); };

Page 35: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

35

complex::complex(double x, double y) { real=x; imag=y; } void complex::afiscomplex() { cout<<real<<" + i * "<<imag; }

Page 36: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

36

complex operator*(complex x, complex y)

{ complex z; z.real = x.real * y.real – x.imag * y.imag; z.imag = x.real * y.imag + x.imag *

y.real; return z; }

Page 37: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

37

complex operator/(complex x, complex y) { complex z; z.real = (y.real * x.real + y.imag * x.imag)

/ (x.real * x.real + x.imag * x.imag); z.imag=(y.imag * x.real – y.real * x.imag)

/ (x.real * x.real + x.imag * x.imag); return z; }

Page 38: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

38

int main(void) { double x, y; cout<<"Dati primul numar

complex\n"; cout<<"Partea reala = "; cin>>x;

cout<<"Partea imaginara = "; cin>>y; complex z1(x,y); z1.afiscomplex();

Page 39: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

39

cout<<"Dati al doilea numar complex\n";

cout<<"Partea reala = "; cin>>x; cout<<"Partea imaginara = "; cin>>y;

complex z2(x,y); z2.afiscomplex();

Page 40: Programare orientata pe obiecte - curs

2.2. Supraîncărcarea operatorilor folosind funcţii prietene (friends)

24.10.2013 Programare orientată pe obiecte C++/Java

40

complex t1, t2; t1 = z1 * z2; cout<<endl<<"Cele doua nr. complexe

inmultite: "; t1.afiscomplex(); t2 = z1 / z2; cout<<endl<<"Cele doua nr. complexe

impartite: "; t2.afiscomplex(); }

Page 41: Programare orientata pe obiecte - curs

24.10.2013 Programare orientată pe obiecte C++/Java

41

Întrebări?