oop_curs2

download oop_curs2

of 41

Transcript of oop_curs2

  • 7/21/2019 oop_curs2

    1/41

    Cursul de programare orientata

    pe obiecte

    Seria 14

    Saptamana 2, 24 feb 2015Andrei Paun

  • 7/21/2019 oop_curs2

    2/41

  • 7/21/2019 oop_curs2

    3/41

    Principiile programarii orientate pe

    obiecte !biecte

    Clase

    "ostenire

    Ascunderea informatiei

    Polimorfism Sabloane

  • 7/21/2019 oop_curs2

    4/41

    !biecte

    au stare si actiuni #metode$functii%

    au interfata #actiuni% si o parte ascunsa

    #starea%

    Sunt grupate in clase, obiecte cu aceleasi

    proprietati

  • 7/21/2019 oop_curs2

    5/41

    Clase

    mentionea&a proprietatile generale ale

    obiectelor din clasa respecti'a

    clasele nu se pot (rula)

    folositoare la encapsulare #ascunderea

    informatiei%

    reutili&are de cod: mostenire

  • 7/21/2019 oop_curs2

    6/41

    "ostenire

    multe obiecte au proprietati similare

    reutili&are de cod

  • 7/21/2019 oop_curs2

    7/41

  • 7/21/2019 oop_curs2

    8/41

    Polimorfism

    tot pentru claritate$ cod mai sigur

    Polimorfism la compilare: e*+ ma*#int%,

    ma*#float%

    Polimorfism la e*ecutie: -

  • 7/21/2019 oop_curs2

    9/41

    Sabloane

    din nou cod mai sigur$reutili&are de cod

    putem implementa lista inlantuita de

    .intregi

    .caractere

    .float

    .obiecte

  • 7/21/2019 oop_curs2

    10/41

    Pri'ire de ansamblu pentru C//

    arne Stroustrup in 13 la ell

    aboratories in "urra 6ill, 7e8 9erse

    5 re'i&ii: 15, 10, 1 A7S-/-S!,

    200; #corrigendum%, 2011 #C//11%, include ?iostream@

    using namespace std

    int main#%

    B int i

    cout ?? Dis is output+En $$ tDis is a single line comment

    $F ou can still use C stle comments F$

    $$ input a number using @@

    cout ?? nter a number:

    cin @@ i

    $$ no8, output a number using ??

    cout ?? i ?? sHuared is ?? iFi ?? En

    return 0I

  • 7/21/2019 oop_curs2

    12/41

    Jiferente cu C

    ?iostream@ #fara +D%

    int main#% #fara 'oid%

    using namespace std

    cout, cin #fara K%

    $$ comentarii pe o linie declarare 'ariabile

  • 7/21/2019 oop_curs2

    13/41

    >include ?iostream@

    using namespace std

    int main# %B

    float f

    cDar strL0M

    double d cout ?? nter t8o floating point numbers:

    cin @@ f @@ d

    cout ?? nter a string:

    cin @@ str

    cout ?? f ?? ?? d ?? ?? str return 0

    I

  • 7/21/2019 oop_curs2

    14/41

    citirea stringNurilor se face pana la primul

    caracter alb

    se poate face afisare folosind toate

    caracterele speciale En, Et, etc+

  • 7/21/2019 oop_curs2

    15/41

    =ariabile locale

    $F -ncorrect in C+ !O in C//+ F$

    int f#%

    B

    int i

    i 10 int $F 8onQt compile as a C program F$

    iF2

    return

    I

  • 7/21/2019 oop_curs2

    16/41

    >include ?iostream@

    using namespace std

    int main#%

    B

    float f

    double d

    cout ?? nter t8o floating point numbers:

    cin @@ f @@ d cout ?? nter a string:

    cDar strL0M $$ str declared Dere, ust before 1st use

    cin @@ str

    cout ?? f ?? ?? d ?? ?? str

    return 0

    I

  • 7/21/2019 oop_curs2

    17/41

    C// 'ecDi 's C// nou

    fara con'ersie automata la int

    nou tip de include

    using namespace

    func#int i%

    B return iFi

    I

    int func#int i%

    B return iFi

    I

  • 7/21/2019 oop_curs2

    18/41

    ipul de date bool

    se definesc true si false #1 si 0%

    C nu il defineste ca bool ci ca Rool #fara

    true$false%

    ?stdbool+D@ pentru compatibilitate

  • 7/21/2019 oop_curs2

    19/41

    2 'ersiuni de C// diferente:

    7oile include ?iostream@ ?fstream@ ?'ector@ ?string@

    math.h este

    string.h este

    math.h deprecated, folositi cmath

  • 7/21/2019 oop_curs2

    20/41

    Clasele in C//

    init#%, pusD#%, pop#% sunt functii membru

    stc, tos: 'ariabile membru

    >define S-T 100$$ Dis creates tDe class stac+

    class stac B

    int stcLS-TM

    int tospublic:

    'oid init#%

    'oid pusD#int i%

    int pop#%

    I

  • 7/21/2019 oop_curs2

    21/41

    se creea&a un tip nou de date

    un obiect instantia&a clasa

    functiile membru sunt date prin semnatura

    pentru definirea fiecarei functii se foloseste ::

    stac mstac

    'oid stac::pusD#int i%

    B if#tosS-T% B

    cout ?? Stac is full+En

    return

    I

    stcLtosM i

    tos//I

  • 7/21/2019 oop_curs2

    22/41

    :: scope resolution operator

    si alte clase pot folosi numele pusD#% si pop#%

    dupa instantiere, pentru apelul pusD#%

    mstac+pusD#5% programul complet in continuare

    stac mstac

  • 7/21/2019 oop_curs2

    23/41

  • 7/21/2019 oop_curs2

    24/41

    ncapsulare

    urmatorul cod nu poate fi folosit in main#%

    stac1+tos 0 $$ rror, tos is pri'ate+

  • 7/21/2019 oop_curs2

    25/41

    !'erloading de functii

    polimorfism

    simplicitate$corectitudine de cod

  • 7/21/2019 oop_curs2

    26/41

    #include

    using namespace std;

    // abs is overloaded three ways

    int absint i!;

    double absdouble d!;long abslong l!;

    int main!

    "

    cout

  • 7/21/2019 oop_curs2

    27/41

    o'erload de functii

    nume acelasi

    diferenta e in tipurile de parametrii

    tipul de intoarcere nu e suficient pentru

    diferenta

    se poate folosi si pentru functii complet

    diferite #nerecomandat%

    o'erload de operatori: mai tar&iu

  • 7/21/2019 oop_curs2

    28/41

    "ostenirea

    incorporarea componentelor unei clase in

    alta

    refolosire de cod

    detalii mai subtile pentru tipuri si subtipuri

    clasa de ba&a, clasa deri'ata

    clasa deri'ata contine toate elementele

    clasei de ba&a, mai adauga noi elemente

  • 7/21/2019 oop_curs2

    29/41

    class building "

    int rooms;

    int floors;

    int area;

    public

    void set-roomsint num!; int get-rooms!;

    void set-floorsint num!;

    int get-floors!;

    void set-areaint num!;

    int get-area!;

    *;

    // house is derived from building

    class house public building "

    int bedrooms;

    int baths;

    public void set-bedroomsint num!;

    int get-bedrooms!;

    void set-bathsint num!;

    int get-baths!;

    *;

    tip acces: public, pri'ate, protected

    mai multe mai tar&iu

    public: membrii publici ai building

    de'in publici pentru Douse

  • 7/21/2019 oop_curs2

    30/41

    Douse 7U are acces la membrii pri'ati ai lui

    building

    asa se reali&ea&a encapsularea

    clasa deri'ata are acces la membrii publici

    ai clasei de ba&a si la toti membrii sai

    #publici si pri'ati%

    #include

  • 7/21/2019 oop_curs2

    31/41

    #include iostream

    using namespace std;

    class building "

    int rooms;

    int floors;

    int area;public

    void set-roomsint num!;

    int get-rooms!;

    void set-floorsint num!;

    int get-floors!;

    void set-areaint num!;

    int get-area!;

    *;

    // house is derived from building

    class house public building "

    int bedrooms;

    int baths;public

    void set-bedroomsint num!;

    int get-bedrooms!;

    void set-bathsint num!;

    int get-baths!;

    *;

    // school is also derived from building

    class school public building "

    int classrooms;

    int offices;

    public

    void set-classroomsint num!;

    int get-classrooms!;

    void set-officesint num!;

    int get-offices!;

    *;

    void buildingset roomsint num!

  • 7/21/2019 oop_curs2

    32/41

    g - !

    " rooms num; *

    void buildingset-floorsint num!

    " floors num; *

    void buildingset-areaint num!

    " area num; *

    int buildingget-rooms!" return rooms; *

    int buildingget-floors!

    " return floors; *

    int buildingget-area!

    " return area; *

    void houseset-bedroomsint num!

    " bedrooms num; *

    void houseset-bathsint num!

    "baths num; *

    int houseget-bedrooms!

    " return bedrooms; *

    int houseget-baths!

    " return baths; *void schoolset-classroomsint num!

    " classrooms num; *

    void schoolset-officesint num!

    " offices num; *

    int schoolget-classrooms!

    " return classrooms; *

    int schoolget-offices!" return offices; *

    int main!

    "

    house h;

    school s;

    h.set-rooms$!; h.set-floors0!;

    h.set-area12%%!;

    h.set-bedrooms2!;

    h.set-baths0!;

    cout

  • 7/21/2019 oop_curs2

    33/41

  • 7/21/2019 oop_curs2

    34/41

    Constructori$Jestructori

    initiali&are automata

    obiectele nu sunt statice

    constructor: functie speciala, numele clasei

    constructorii nu pot intoarce 'alori #nu au

    tip de intoarcere%

  • 7/21/2019 oop_curs2

    35/41

  • 7/21/2019 oop_curs2

    36/41

  • 7/21/2019 oop_curs2

    37/41

    // +sing a constructor and destructor. void stac6pushint i!"

  • 7/21/2019 oop_curs2

    38/41

    #include

    using namespace std;

    #define 849: $%%

    // 5his creates the class stac6.

    class stac6 " int stc67849:;

    int tos;

    public

    stac6!; // constructor

    stac6!; // destructor

    void pushint i!;

    int pop!;

    *;

    // stac6s constructor

    stac6stac6!

    "

    tos %; cout

  • 7/21/2019 oop_curs2

    39/41

    Clasele in C//

    cu (class)

    obiectele instantia&a clase

    similare cu structNuri si unionNuri au functii

    specificatorii de acces: public, pri'ate, protected

    default: pri'ate protected: pentru mostenire, 'orbim mai tar&iu

  • 7/21/2019 oop_curs2

    40/41

    class nume_clasa {

    private variabile si functii membru

    specificator_de_acces:

    variabile si functii membruspecificator_de_acces:

    variabile si functii membru

    $$ +++

    specificator_de_acces:

    variabile si functii membru

    } lista_obiecte;

    putem trece de la public la pri'ate si iar la public, etc+

  • 7/21/2019 oop_curs2

    41/41

    se foloseste mai mult a doua 'arianta un membru #neNstatic% al clasei nu poate

    a'ea initiali&are

    nu putem a'ea ca membri obiecte de tipulclasei #putem a'ea pointeri la tipul clasei%

    nu auto, e*tern, register

    class employee "

    char name73%; // private by default

    public

    void putnamechar Bn!; // these are public

    void getnamechar Bn!;

    private double wage; // now, private again

    public

    void putwagedouble w!; // bac6 to public

    double getwage!;

    *;

    class employee "

    char name73%;

    double wage;

    public

    void putnamechar Bn!;

    void getnamechar Bn!; void putwagedouble w!;

    double getwage!;

    *;