Click here to load reader

Objektno programiranje (C++)

  • View
    72

  • Download
    1

Embed Size (px)

DESCRIPTION

Objektno programiranje (C++). Pravila ocjenjivanja. Održat će se dva kolokvija. Svaki nosi po 30 bodova. Za prolaz treba imati 25 bodova. Treba predati rješenja dviju domaćih zadaća. Svaka zadaća nosi 20 bodova. Minimum za prolaz je 15 bodova. - PowerPoint PPT Presentation

Text of Objektno programiranje (C++)

  • Objektno programiranje (C++)

  • Pravila ocjenjivanjaOdrat e se dva kolokvija. Svaki nosi po 30 bodova. Za prolaz treba imati 25 bodova.

    Treba predati rjeenja dviju domaih zadaa. Svaka zadaa nosi 20 bodova. Minimum za prolaz je 15 bodova.

    Popravni kolokvij (maksimum je 45, treba skupiti 20 bodova).

  • GradivoOcjene:

    45-59 bodova: dovoljan (2) 60-74 boda: dobar (3) 75-85 bodova: vrlo dobar (4) 86-100 bodova: izvrstan (5)

  • Ciljevi kolegija: Uvod u objektno orijentirano i generiko programiranje kroz programski jezik C++ Detaljna prezentacija C++-a Pripadne standardne biblioteke: STL, BoostNapredne tehnike programiranja, softverski predloci

  • Gradivo Klase Kontrola kopiranja Operatori Spremnici Iznimke Imenici Nasljeivanje Polimorfizam RTTI Predloci

  • Nastavni materijali Stranica kolegija: http://web.math.hr/nastava/opepp Vjebe: http://web.math.hr/~vpetrice/opepp

    Preporuuju se i slideovi kolegija Raunarski praktikum 4 (Botinan, Petrievi, Pulji).

  • LiteraturaOsnovna: Stanley B. Lippman, Jose Lajoie, Barbara E. Moo: C++ Primer, Fourth Edition, Addison Wesley Professional, 2005. Julijan ribar, Boris Motik: Demistificirani C++, 2. izdanje, Element, Zagreb, 2006. Bruce Eckel: Thinking in C++, 1. i 2. dio (besplatna e-knjiga) : http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html

  • LiteraturaNapredna: Bjarne Stroustrup: The C++ Programming Language, Addison Wesley, 2000. Scott Meyers: Effective C++, Third Edition, Addison-Wesley, 2006. Scott Meyers: More Effective C++, Addison-Wesley, 1996. Herb Sutter: Exceptional C++, Addison Wesley, 2000. Stephen C. Dewhurst: C++ Common Knowledge, Addison Wesley, 2005. Erich Gamma, et. all: Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series).

  • Povijest Programski jezik C++ nastao je razvojem jezika C i zadrava visoku kompatibilnost s njime. Kreator jezika je Bjarne Stroustrup (http://www.research.att.com/~bs/). Razvoj je zapoeo 1979. g.; ime C++ skovano je 1983. godine, a prva komercijalna implementacija pojavila se 1985. Izmeu 1985. i 1989. jezik je doivio vee inovacije: zatieni lanovi, parametrizirane klase, viestruko nasljeivanje itd. Jezik je 1997. godine definiran standardnom koji nosi ime ISO/IEC 14882:2003. Planira se novi standard C++0x.

  • Objektno orijentirano programiranje

    U centru interesa softverskog inenjerstva su sloene aplikacije.

    Problemi: Odrivost -- mogunost lakog odravanja koda.Proirivost -- mogunost lakog dodavanja nove funkcionalnosti.

  • Tehnike programiranjaProceduralna:Razlaganje programa na manje cjeline -- implementacija pomou funkcija procedura.Nemogunost definiranja apstrakcije koncepata iz aplikacijske domene. Ne nudi podrku za postizanje odrivosti i proirivosti. "Svemogua" main funkcija.

  • Tehnike programiranjaObjektno orijentirana:Klase predstavljaju koncepte iz aplikacijske domene.Program se sastoji od objekta (instance klasa) i njihove komunikacije. Objekti imaju punu odgovornost za svoje ponaanje.

  • Osnovni elementi OO tehnike:

    Apstrakcija -- Koncepti se reprezentiraju neposredno u programu, a izvedbeni detalji su skriveni iza suelja (eng. interface) koje reprezentira koncept. Enkapsulacija -- Sposobnost osiguravanja da se apstrakcija koristi prema svojim specifikacijama. Enkapsulacijom se spreava naruavanje apstrakcije, odnosno prodiranje implementacijskih odluka izvan granica apstrakcije. Polimorfizam -- Skrivanje razliitih implementacija iza istog suelja. Osigurava iroku primjenjivost koda i reducira zavisnost o implementaciji.Nasljeivanje -- Konstrukcija novih apstrakcija polazei od ve postojeih.

  • Generiko programiranjePojam generikog programiranja odnosi se na generalizaciju softverskih komponenti kako bi se lako mogle koristiti u razliitim situacijama. Osnovni elementi generikog programiranja u C++-u su parametrizirane klase i funkcije.

  • ReferenceReferenca na neki objekt je novo ime za taj objekt. Osnovna uloga reference je omoguiti prijenos parametara po referenci, dakle prijenos u kojem nema kopiranja parametra, ve funkcija dobiva referencu na objekt. Referenca spada u tzv. sloeni tip (engl. compound type), tip koji se gradi pomou drugih tipova. Tu spadaju jo pokazivai (na neki tip) i polja (nekog tipa). Budui da referenca uvijek mora referirati na neki objekt, slijedi pravilo: Prilikom deklaracije referenca mora biti inicijalizirana.

    int n=100; int &rn = n; float ℞ // Greka pri kompilaciji. Neinicijalizirana referenca

  • ReferenceNa jedan objekt moemo imati vie referenci, a kako je svaka referenca samo novo ime za objekt, svaka promjena objekta putem jedne reference vidljiva je i kroz sve druge.

    int n = 100; int &rn1 = n; int &rn2 = n;std::cout

  • ReferenceReferenca moe biti konstantna i tada moe referirati na konstantan objekt. Obina referenca ne moe referirati na konstantu: char &ra = 'a'; // greka pri kompilaciji. // Nekonstantna referenca, konstantan objekt. const char &rb = 'b'; // o.k. Konstantna referenca nam garantira da kroz nju ne moemo promijeniti objekt na koji referira.

    Referenca je dakle isto to i pokaziva koji se automatski dereferencira. Za razliku od pokazivaa, referenca koja referira na jedan objekt nikad ne moe referirati na neki drugi objekt.

  • ReferenceKoritenjem referenci donekle ograniavamo prirodan nain koritenja implicitnih konverzija. Na primjer, sljedei kod javlja greku pri kompilaciji.

    double x = 2.71; int &rx = x;

    S druge strane, sljedei javlja samo upozorenje o konverziji double u int (jer je naravno mogu gubitak podataka):

    double x = 2.71; const int &rx = x;

  • ReferenceKada prevoditelj treba referencu na jedan tip inicijalizirati objektom nekog drugog, kompatibilnog, tipa, on kreira privremeni objekt istog tipa kao i referenca, vri konverziju i inicijalizira referencu tim privremenim objektom.

    Kod koji prevoditelj generira izgleda, dakle, ovako: double x = 2.71; int tmp = x; const int &rx = tmp;

    Nekonstantna referenca nekog tipa moe biti inicijalizirana jedino objektom egzaktno tog istog tipa.

  • ReferenceReferencu moemo definirati i na pokaziva. int n = 100; int *pn = &n; int *&rpn = pn; // Referenca na pokaziva std::cout
  • Referencevoid f(int *p){std::cout
  • ReferenceU C++ u koristimo reference kad ne elimo prijenos parametara po vrijednosti. Ako je formalni argument funkcije deklariran kao referenca nekog tipa, onda prilikom poziva funkcije nee doi do kopiranja stvarnog argumenta u formalni, ve e formalni argument (koji je referenca) biti inicijaliziran stvarnim. Formalni argument tako postaje alias za stvarni argument i kroz njega moemo dohvatiti stvarni argument. Na taj se nain postie prijenos parametara po referenci. voidswap(int &x, int &y) { inttmp = x; x = y; y = tmp; }

    Prijenos po referenci vrimo kad elimo mijenjati stvarni argument ili kad je argument suvie velik za kopiranje.

  • ReferenceU drugom sluaju, kad samo elimo izbjei kopiranje stvarnog argumenta, formalni argument treba deklarirati kao konstantnu referencu.

    S druge strane, kako je mogue konstantnu referencu inicijalizirati nekonstantnim objektom (const je samo obeanje da referenca nee sluiti za mijenjanje objekta), funkcija koja deklarira konstantnu referencu moe uvijek uzeti nekonstantan argument (koji, naravno, ne moe u svom tijelu promijeniti).

  • Referencevoidprint(std::string& text) { std::cout
  • ReferenceAko je argument funkcije deklariran kao nekonstantna referenca, onda pri pozivu funkcije nije dozvoljena konverzija tipova za taj argument. Formalni i stvarni argument moraju biti istog tipa.

    Kad je referenca konstantna, onda je, kao to smo vidjeli, konverzija dozvoljena. Treba imati pri tome na umu da e prevoditelj generirati privremeni objekt i da e formalni argument referirati na njega.

  • ReferenceKako se polja ne mogu kopirati, ne moemo napisati funkciju koja ima parametar tipa polje. Kad koristimo polje u izrazima, ono se automatski konvertira u pokaziva na prvi lan polja.Sljedee deklaracije su ekvivalentne. Interpretiraju se kao funkcija koja kao parametar prima pokaziva tipa int*.

    void print( int * ){ ..}void print( int[ ] ){ . }void print( int[100] ){ }

  • ReferenceFunkcija koja uzima polje kao argument dobiva pokaziva na prvi element polja. Takva funkcija moe uzeti polje bilo koje dimenzije. S druge strane, mogue je deklarirati funkciju koja uzima referencu na polje: intcount(int(&arr)[4]) { intx = 0; for(inti=0; i< 4; ++i) x += arr[i]; returnx; }

    Funkcija count e uzimati samo polja dimenzije 4, jer nema implicitnih konverzija izmeu polja razliite veliine. Referenca na polje je dakle manje fleksibilna od pokazivaa na polje, pa se stoga rijetko koristi kao parametar funkcije.

  • ReferenceAko funkcija vraa referencu, tada ne dolazi do kopiranja vrijednosti, ve samo do kopiranja reference. Za velike objekte to moe biti velika uteda. Referenca kao povratna vrijednost ima jo i tu prednost da predstavlja vrijednost koja se moe nai na lijevoj strani znaka jednakosti (lvalue). char& get(std::string& s, unsignedi) { returns[i]; }

    std::string s1("abc"); get(s1,2)='z';

  • ReferenceMoramo paziti da nikad ne vratimo referencu na lokalnu varijablu jer e ona nakon vraanja reference na nju biti unitena. Isto naravno vrijedi i za pokaziva na lokalnu varijablu.

    // Neispravan kod std::string&ccn(conststd::string& s1, conststd::string& s2){ std::string tmp = s1+s2; returntmp;

Search related