+ All Categories
Home > Documents > Programare orientată pe · Curs 4 Programare orientată pe obiecte C++/Java 24.10.2013 3 1....

Programare orientată pe · Curs 4 Programare orientată pe obiecte C++/Java 24.10.2013 3 1....

Date post: 31-Jan-2021
Category:
Upload: others
View: 9 times
Download: 0 times
Share this document with a friend
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
  • 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:

    + *= ->

    - %= >

    / |= []

    % >>= ()

    ^ *

    -= ,

  • 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 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

  • 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

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

    24.10.2013 Programare orientată pe obiecte C++/Java

    27

    cout

  • 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

  • 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 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

  • 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

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

    24.10.2013 Programare orientată pe obiecte C++/Java

    39

    cout

  • 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

  • 24.10.2013 Programare orientată pe obiecte C++/Java

    41

    Întrebări?


Recommended