Programare orientata pe obiecte - curs

Post on 29-Jan-2017

254 views 8 download

Transcript of 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

24.10.2013 Programare orientată pe obiecte C++/Java

2

Curs 4 Supraîncărcarea operatorilor

(partea I)

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)

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.

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)

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 ->*.

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.

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”.

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).

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

10

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

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[]

! >=

= &&

< ++

> --

+= ->*

-= ,

1. Supraîncărcarea operatorilor

24.10.2013 Programare orientată pe obiecte C++/Java

12

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

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.

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 „=”).

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)

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

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

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)

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)

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)

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;

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

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

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

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

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();

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();

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(); }

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)

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”.

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.

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ă.

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;

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

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

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

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

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();

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();

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(); }

24.10.2013 Programare orientată pe obiecte C++/Java

41

Întrebări?