curs5-poo(2012)

Upload: diaconu-florin

Post on 16-Oct-2015

12 views

Category:

Documents


2 download

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?