curs3-poo2013.pdf

Upload: corinutza260

Post on 20-Feb-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/24/2019 curs3-POO2013.pdf

    1/57

    LECTOR DR. ADRIAN RUNCEANU

    Programare orientat peobiecte

    UniversitateaConstantin Brncui din Trgu-Jiu

    Facultatea de Inginerie

    Departamentul de Automatic, Energie i Mediu

  • 7/24/2019 curs3-POO2013.pdf

    2/57

    14.10.2013Programare orientat pe obiecte C++/Java

    2

    Curs 3

  • 7/24/2019 curs3-POO2013.pdf

    3/57

    Curs 3

    14.10.2013Programare orientat pe obiecte C++/Java

    3

    1. Tablouri de obiecte2. Membrii statici ai unei clase

    3. Manevrarea dinamica aobiectelor4. Pointerii catre membrii unei

    clase

  • 7/24/2019 curs3-POO2013.pdf

    4/57

    1.Tablouri de obiecte

    14.10.2013Programare orientat pe obiecte C++/Java

    4

    La fel cum exista posibilitatea de a creatablouri de structuri, tot astfel existaposibilitatea de a crea si tablouri de obiecte.

    De exemplu, putem avea un triunghi vazutca un vector de trei puncte:

    Punct triunghi[3];

  • 7/24/2019 curs3-POO2013.pdf

    5/57

    14.10.2013Programare orientat pe obiecte C++/Java

    5

    Putem de asemenea, initializa acest vectorchiar pe linia de declarare:

    Punct triunghi[3] = { {0,0}, {20,30}, {40,70} };In plus, putem initializa un tablou de obiecte

    chiar in cadrul declararii sale:

    Punct triunghi[3] = {

    Punct (1,2),Punct(30,90),Punct (40,40)

    };

    1.Tablouri de obiecte

  • 7/24/2019 curs3-POO2013.pdf

    6/57

    14.10.2013Programare orientat pe obiecte C++/Java

    6

    unde clasa Punctare urmatoarea declaratie:

    class Punct {

    public:

    int x,y;

    Punct(int x1, int y1)

    { x=x1; y=y1; }

    Punct(int x1)

    { x=x1; y=x1; }

    };

    1.Tablouri de obiecte

  • 7/24/2019 curs3-POO2013.pdf

    7/57

    Curs 3

    14.10.2013Programare orientat pe obiecte C++/Java

    7

    1. Tablouri de obiecte2. Membrii statici ai unei clase3. Manevrarea dinamica a

    obiectelor4. Pointerii catre membrii unei

    clase

  • 7/24/2019 curs3-POO2013.pdf

    8/57

    2. Membri statici ai unei clase

    14.10.2013Programare orientat pe obiecte C++/Java

    8

    Spre deosebire de auto, register siextern, cuvantul cheie staticpoate fi utilizat inprefixarea membrilor unei clase.

    Evident ca, odata declarat static, membrulrespectiv va avea proprietati diferite de membriiobisnuiti (ne-statici).

    Aceste proprietati apar datorita faptului ca

    membrii statici nu apartin unui obiect anume, eifiind sunt comuni tuturor instantierilor(obiectelor)unei clase.

  • 7/24/2019 curs3-POO2013.pdf

    9/57

    14.10.2013Programare orientat pe obiecte C++/Java

    9

    Sunt situatii de programare cand sedoreste ca un singur spatiu de memorie sa

    fie utilizat de toate obiecte unei clase.In limbajul C++, am putea utiliza o

    variabila globala, dar acest lucru nu este

    chiar sigur.

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    10/57

    14.10.2013Programare orientat pe obiecte C++/Java

    10

    Variabilele globale pot fi modificate decatre oricine, iar numele lor se potpotrivi(suprapune) cu alte nume identice

    in cazul unui proiect mai mare.Ar fi ideal ca o variabila (data,

    informatie) sa poata sa fie stocata

    (memorata) ca si cum ar fi globala, darsa fie ascunsa intr-o clasa, si asociataclar cu o clasa.

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    11/57

    14.10.2013Programare orientat pe obiecte C++/Java

    11

    Acest aspect se poate rezolvafolosind date membre ntr-o variabilde tip staticn interiorul unei clase:

    Declararea unei date statice se face ninteriorul unei clase,iar definiia trebuie s se fac n afara

    clasei (nu se accept funcii inline nacest caz) i este permisdoar o singurdefiniie.

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    12/57

    14.10.2013Programare orientat pe obiecte C++/Java

    12

    Sintaxa declarri unei date statice esteobinuit:

    De exemplu:

    class A {staticint i;

    public:

    // . . . .};

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    13/57

    14.10.2013Programare orientat pe obiecte C++/Java

    13

    iar mai tarziu, definiia:int A::i=1;

    Este asemntoare cu declararea unei

    variabile globale:int i=1;

    doar c n cazul claselor se folosete

    prefixarea obiectului cu operatorul derezoluie specificA::i.

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    14/57

    14.10.2013Programare orientat pe obiecte C++/Java

    14

    Se poate induce ideea cA::i esteprivate i totui poate fi manipulat nafar, de unde s-ar putea trageconcluzia cmecanismul proteciei ar finclcat.

    Totui nu este aa, din doumotive:

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    15/57

    14.10.2013Programare orientat pe obiecte C++/Java

    15

    1. n primul rand, este singurul loc unde aceastainitializare este acceptata de compilator.

    Intr-adevar daca o variabila statica ar avea un constructoratasat, am putea chema constructorul pentru crearea sa in loc

    sa utilizam operatorul =.2. n al doilea rand, odata ce a fost facuta definitia,

    utilizatorul nu mai poate crea o a doua definitie,deoarece link-editorul va raporta o eroare.

    si atunci creatorul clasei este fortat sa creeze definitia, altfelnu se va face legatura in timpul executiei programului.

    Acest aspect ne asigura ca aceasta definitie se poate facedoar de catre creatorul clasei respective.

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    16/57

    14.10.2013Programare orientat pe obiecte C++/Java

    16

    Exemplu:#includeint x=100; // variabila globala xclass cu_static{

    staticint x; // informatie protejata xstaticint y; // informatie protejata ypublic:

    void afiseaza(){

    cout

  • 7/24/2019 curs3-POO2013.pdf

    17/57

    14.10.2013Programare orientat pe obiecte C++/Java

    17

    int cu_static::x=1; // definitia informatiei are loc inafara clasei

    int cu_static::y=x+1; // definitia informatiei are loc inafara clasei

    int main(){

    cu_static a;a.afiseaza();

    cout

  • 7/24/2019 curs3-POO2013.pdf

    18/57

    14.10.2013Programare orientat pe obiecte C++/Java

    18

    Dupa executia programului se va afisa:

    cu_static::x = 1cu_static::y = 2variabila globala x = 100

    2. Membri statici ai unei clase

  • 7/24/2019 curs3-POO2013.pdf

    19/57

    Curs 3

    14.10.2013Programare orientat pe obiecte C++/Java

    19

    1. Tablouri de obiecte2. Membrii statici ai unei clase3. Manevrarea dinamica a

    obiectelor4. Pointerii catre membrii unei

    clase

  • 7/24/2019 curs3-POO2013.pdf

    20/57

    3. Manevrarea dinamica a obiectelor

    14.10.2013Programare orientat pe obiecte C++/Java

    20

    Obiectele, ca si celelalte tipuri de date ale limbajuluiC++, pot fi alocate dinamic, adica se poate alocamemorie doar in timpul executiei programului.

    In limbajul C, pentru aceste actiuni puteam folosifunctii predefinite, din fisierul alloc.h calloc(),malloc(), realloc() si free(). Dintre acestea cele maiutilizate sunt malloc()sifree().

    In limbajul C++, echivalentul celor doua functiispecificate mai sus sunt cei doi operatori new sidelete.

  • 7/24/2019 curs3-POO2013.pdf

    21/57

    14.10.2013Programare orientat pe obiecte C++/Java

    21

    3.1 Operatorul newAvantajul acestui operator, fa de funcia

    malloc()constn douaspecte:

    1. new stie ct memorie trebuie alocatoricrui tip de variabil, spre deosebire defuncia malloc(), unde trebuia s specificeutilizatorul aceastdimensiune;

    2. new poate produce apelul unui constructor,n timp ce malloc() nu are aceastproprietate.

    3. Manevrarea dinamica a obiectelor

  • 7/24/2019 curs3-POO2013.pdf

    22/57

    14.10.2013Programare orientat pe obiecte C++/Java

    22

    Exemple:

    Operatorul newse poate utiliza si pentrudeclararea de tablouri:int *p=new int[10];

    // varianta C

    int *pointer=(int*)malloc(sizeof(int));

    // varianta C++

    int *pointer= new int;

    3. Manevrarea dinamica a obiectelor

  • 7/24/2019 curs3-POO2013.pdf

    23/57

    14.10.2013Programare orientat pe obiecte C++/Java

    23

    Folosind acest operator la clase se pot faceurmatoarele tipuri de declarari:

    Punct *p=new Punct(20,20);

    Efectul este rezervarea de memorie pentruobiectul specificat (Punct), dupa care se va apelaconstructorul obiectului.

    Asemanator se poate declara un tablou de

    obiecte:Punct *poligoane=new Punct[10];

    3. Manevrarea dinamica a obiectelor

  • 7/24/2019 curs3-POO2013.pdf

    24/57

    14.10.2013Programare orientat pe obiecte C++/Java

    24

    3.2 Operatorul delete Operatorul deleteeste analogul functiei free()din

    limbajul C, si are ca efect eliberarea spatiului dememorie ocupat cu ajutorul operatorului new.

    Asa cum operatorul new este utilizat de obicei ininteriorul constructorilor, tot asa si operatoruldeleteva fi utilizat in interiorul destructorilor.

    Cu toate ca delete permite eliberarea selectiv aspatiului alocat, acest operator nu este la fel deputernic la operatorul new.

    3. Manevrarea dinamica a obiectelor

  • 7/24/2019 curs3-POO2013.pdf

    25/57

    14.10.2013Programare orientat pe obiecte C++/Java

    25

    Din urmatorul exemplu, am puteatrage concluzia falsa ca folosirea

    operatorului delete va conduce laeliberarea spatiului de memorie alocatpentru intreg tabloul de numere:

    int *m=new int[10];delete m;

    3. Manevrarea dinamica a obiectelor

  • 7/24/2019 curs3-POO2013.pdf

    26/57

    14.10.2013Programare orientat pe obiecte C++/Java

    26

    De fapt, s-a eliberat spatiul dememorie doar pentru un singur numarintreg m[0], restul ramanand ocupat.

    Pentru eliberarea completa aintregului spatiu alocat cu operatorulnew, trebuie sa folosim operatorul

    deleteastfel:int *m=new int[10];delete[] m;

    3. Manevrarea dinamica a obiectelor

  • 7/24/2019 curs3-POO2013.pdf

    27/57

    Curs 3

    14.10.2013Programare orientat pe obiecte C++/Java

    27

    1. Tablouri de obiecte2. Membrii statici ai unei clase3. Manevrarea dinamica a

    obiectelor4. Pointerii catre membrii unei

    clase

  • 7/24/2019 curs3-POO2013.pdf

    28/57

    4. Pointeri catre membrii unei clase

    14.10.2013Programare orientat pe obiecte C++/Java

    28

    Unpointer este o variabila care retineadresa unei anumite zone de memorie, incare poate fi ori o data(informatie), ori o

    functie.In limbajul C++, un pointer catre un

    membru al unei clase urmeaza acelasi

    principiu, cu exceptia faptului ca selecteaza olocatie din interiorul unei clase.

  • 7/24/2019 curs3-POO2013.pdf

    29/57

    14.10.2013Programare orientat pe obiecte C++/Java

    29

    Problema ar putea fi faptul ca totipointerii au o adresa, dar in interiorulunei clase nu exista o adresa, de undeselectarea unui membru sa fie posibila.

    Astfel pointerul respectiv nu va contineadresa de memorie a intregii clase, cinumai deplasarea datei in cadruloricarui obiect al clasei.

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    30/57

    14.10.2013Programare orientat pe obiecte C++/Java

    30

    Pentru operatii cu pointeri exista cateva reguli desintaxa:

    pentru preluarea adresei unui membru se poate folosioperatorul & urmat de numele clasei, operatorul derezolutie si numele membrului:

    pointer_membru=&clasa::membru;

    pentru accesul la un membru dupa preluarea adresei,

    trebuie indicat un obiect al clasei si numele variabileipointer, folosind unul dintre operatorii specializati: operatorul .* daca se specifica un obiect al clasei operatorul ->*daca se specifica un pointer de obiect

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    31/57

    14.10.2013Programare orientat pe obiecte C++/Java

    31

    Sintaxa este urmatoarea:obiect.*pointer

    saupointer_obiect ->*

    pointer_membru

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    32/57

    14.10.2013Programare orientat pe obiecte C++/Java

    32

    Pentru exemplificare prezentam oclasa numita pozitie care se folosestepentru a stabili pozitia unui punct in

    plan:#includeclass pozitie{

    public:int x,y; //coordonatele unui punct

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    33/57

    14.10.2013Programare orientat pe obiecte C++/Java

    33

    // functii membrepozitie(int abcisa=0, int ordonata=0) // constructor

    {x = abcisa;

    y = ordonata;cout

  • 7/24/2019 curs3-POO2013.pdf

    34/57

    14.10.2013Programare orientat pe obiecte C++/Java

    34

    void afisare() // afisarea coordonatelor{

    cout

  • 7/24/2019 curs3-POO2013.pdf

    35/57

    14.10.2013Programare orientat pe obiecte C++/Java

    35

    int main(void){

    pozitie p(1,1); // declarare obiectpozitie *pointer; // declarare pointer catre un obiect

    int pozitie::x_pointer, pozitie::y_pointer;void (pozitie::*pointer_functie)(int,int); //declarare pointer catre o functie din clasa resp.

    pointer=&p; // initializarea pointerului resp. cu adresa

    obiectului pe care il prelucreazax_pointer=&pozitie::x;// initializarea var. din pointercu adresa unei informatii din interiorul clasei

    y_pointer=&pozitie::y; // initializarea var. din pointercu adresa unei informatii din interiorul clasei

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    36/57

    14.10.2013Programare orientat pe obiecte C++/Java

    36

    pointer_functie=pozitie::deplasare;(p.pointer_functie)(10,10);cout

  • 7/24/2019 curs3-POO2013.pdf

    37/57

    14.10.2013Programare orientat pe obiecte C++/Java

    37

    Problema rezolvataTablouri de dimensiune

    variabilaUrmatoarea problema rezolvataprezinta o modalitate de creare a

    unor tablouri de dimensiunivariabile.

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    38/57

    14.10.2013Programare orientat pe obiecte C++/Java

    38

    Tipul de date il numim array(vector=sir) si contine:

    1. un constructor care creeaza siinitializeaza tablourile

    2. un destructor elibereaza memoriaalocata pentru un tablou

    3. o procedura de concatenare a douatablouri

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    39/57

    14.10.2013Programare orientat pe obiecte C++/Java

    39

    #include#include#includeclass array{

    int *pointer; // pointer la tablou=arrayint dimensiune; // dimensiunea tablouluivoid print(void); // afiseaza tabloululvoid test(void *); // testeaza daca s-a alocat corectmemoria

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    40/57

    14.10.2013Programare orientat pe obiecte C++/Java

    40

    public:array(int); //constructor~array(void) //destructor{

    delete[dimensiune] pointer;}

    void concatenare(array &);//metoda(procedura) de concatenare

    int cauta(array &); // metoda pentrucautarea unui element

    };

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    41/57

    14.10.2013Programare orientat pe obiecte C++/Java

    41

    // procedura de test// Testeaza valoarea unui pointer pentru care s-a alocat

    dinamic memorie.// Daca pointer-ul este setat la NULL inseamna ca

    operatia de alocare dinamica a memoriei nu s-a

    efectuat corectvoid array::test(void *p){

    if(p==NULL){

    cout

  • 7/24/2019 curs3-POO2013.pdf

    42/57

    14.10.2013Programare orientat pe obiecte C++/Java

    42

    // se creeaza un tablou de intregi cu "numar_elem" elemente.// Initializarea tabloului cu valori citite de la tastatura.

    array::array(int numar_elem){

    cout

  • 7/24/2019 curs3-POO2013.pdf

    43/57

    14.10.2013Programare orientat pe obiecte C++/Java

    43

    // afiseaza elementele dintr-un tablouvoid array::print(void){

    cout

  • 7/24/2019 curs3-POO2013.pdf

    44/57

    14.10.2013Programare orientat pe obiecte C++/Java

    44

    // concateneaza tablou care a apelat metoda cu cel primit caparametru

    // (prin referinta); rezultatul se va pastra in obiectul care a apelatmetoda.

    void array::concatenare(array &referinta_array)

    {int *temp;int dimensiune_finala;

    // calcularea noii dimensiuni a tabloului rezultat

    dimensiune_finala=dimensiune+referinta_array.dimensiune;

    // alocare memorie necesara

    temp=new int[dimensiune_finala];test((void*) temp);

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    45/57

    14.10.2013Programare orientat pe obiecte C++/Java

    45

    // copierea celor doi "operanzi" in cadrul "rezultatului"for(int i=0;i

  • 7/24/2019 curs3-POO2013.pdf

    46/57

    14.10.2013Programare orientat pe obiecte C++/Java

    46

    int main(void){

    array a(6);array b(4);int i;cout

  • 7/24/2019 curs3-POO2013.pdf

    47/57

    14.10.2013Programare orientat pe obiecte C++/Java

    47

    Daca se introduc valorile:1, 2, 3, 4, 5, 6 pentru tabloul a,respectiv valorile 7, 8, 9, 10 pentru tabloulb

    si valorile 11, 22, 33, 44 pentru tabloul cVom obtine:a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} in prima faza,

    iar apoia = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 22, 33, 44}.

    4. Pointeri catre membrii unei clase

  • 7/24/2019 curs3-POO2013.pdf

    48/57

    Exemplu de aplicaie

    14.10.2013Programare orientat pe obiecte C++/Java

    48

    AplicaierezolvatS se defineasc tipul abstract de date

    complex care s aib funcii membru

    pentru:1. modulul unui numar complex2. accesul la partea real i imaginar a

    obiectelor de tip complex3. afiarea obiectelor complexe4. constructori pentru iniializare i copiere

  • 7/24/2019 curs3-POO2013.pdf

    49/57

    14.10.2013Programare orientat pe obiecte C++/Java

    49

    S se scrie un program care srealizeze urmtoarele:

    Citete perechi de n numere care

    reprezint fiecare, partea real irespectiv imaginar a unui numrcomplex

    Afieaz:1. numrul complex citit2. suma numerelor complexe citite

    Exemplu de aplicaie

  • 7/24/2019 curs3-POO2013.pdf

    50/57

    14.10.2013Programare orientat pe obiecte C++/Java

    50

    #include#include#define PI 3.14159265358979

    class complex{

    // date membru protejate(private)

    double real;

    double imag;

    Exemplu de aplicaie

  • 7/24/2019 curs3-POO2013.pdf

    51/57

    14.10.2013Programare orientat pe obiecte C++/Java

    51

    // funcii membru neprotejatepublic:

    // constructor folosit la initializare

    complex(double x=0, double y=0);

    // constructor de copiere

    complex(const complex &);// modulul numrului complexdouble modul();// afieaznumrul complexvoid afiscomplex();

    };

    Exemplu de aplicaie

  • 7/24/2019 curs3-POO2013.pdf

    52/57

    14.10.2013Programare orientat pe obiecte C++/Java

    52

    complex::complex(double x, double y){

    real = x;imag = y;

    }complex::complex(const complex &z){

    real = z.real;

    imag = z.imag;}

    Exemplu de aplicaie

  • 7/24/2019 curs3-POO2013.pdf

    53/57

    14.10.2013Programare orientat pe obiecte C++/Java

    53

    double complex::modul(){

    return sqrt(real * real + imag * imag);}

    void complex::afiscomplex(){

    cout

  • 7/24/2019 curs3-POO2013.pdf

    54/57

    14.10.2013Programare orientat pe obiecte C++/Java

    54

    int main(void){

    double x, y, sumax = 0, sumay = 0, i = 0, n;coutn;while(i

  • 7/24/2019 curs3-POO2013.pdf

    55/57

    14.10.2013Programare orientat pe obiecte C++/Java

    55

    // se construieste nr. complex avand partile citite mai sus;// se apeleaza constructorul care realizeaza initializarea// obiectului z=x+i*y

    complex z(x,y);// afisez numarul z

    cout

  • 7/24/2019 curs3-POO2013.pdf

    56/57

    14.10.2013Programare orientat pe obiecte C++/Java

    56

    // se apeleaza constructorul de initializarecomplex sz = complex(sumax,sumay);

    cout

  • 7/24/2019 curs3-POO2013.pdf

    57/57

    57

    ntrebri?