02 prosirenja c

49
Objektno orijentisano programiranje 1 Proširenja jezika C

Upload: velikimoral

Post on 26-Sep-2015

228 views

Category:

Documents


8 download

DESCRIPTION

dsfd

TRANSCRIPT

  • Objektno orijentisanoprogramiranje 1

    Proirenja jezika C

  • 12.10.2010.Proirenja jezika C2

    Deklaracije i definicije

    Deklaracija je iskaz koji samo uvodi neko ime u program govori prevodiocu kojoj jezikoj kategoriji pripada ime

    Ime se moe koristiti samo ako je prethodno barem deklarisano Definicija je ona deklaracija koja

    kreira objekat (dodeljuje mu memorijski prostor), navodi telo funkcije, ili u potpunosti navodi strukturu korisnikog tipa (ukljuujui klase u C++)

    U programu moe postojati: samo jedna definicija jednog objekta, funkcije i tipa proizvoljno mnogo deklaracija

    Na jeziku C definicije objekata mogu biti samo na poetku bloka,a njihova oblast vaenja je do kraja bloka

    Na jeziku C++ definicija objekta je naredba,pa se moe nai bilo gde u programu

    Objekat moe biti inicijalizovan u definiciji

  • 12.10.2010.Proirenja jezika C3

    Objekti

    Objekat u irem smislu: definisano podruje u memoriji, u toku izvravanja programa primerak proizvoljnog tipa (ugraenog ili klase)

    Objekat u uem smislu: primerak (instanca) klase

    Objekat je neto (u memoriji) to ima stanje, ponaanje i identitet funkcija je u memoriji, ali nije objekat (nema stanje) podatak primitivnog tipa (koji je objekat u irem smislu) nema identitet

    Promenljiva: objekat koji nije konstantan

    Promenljiva moe biti: globalna ili lokalna, statika, automatska, dinamika, privremena (tranzijentna)

  • 12.10.2010.Proirenja jezika C4

    Lvrednosti

    lvrednost (lvalue) je izraz koji upuuje na objekat (u irem smislu) ili funkciju lvalue je kovanica od

    "neto to moe da stoji sa leve strane znaka dodele vrednosti" Sa leve strane znaka = mogu da stoje samo promenljive lvrednosti Promenljiva lvrednost (modifiable lvalue) je ona lvrednost,

    koja nije ime funkcije, ime niza, ni konstantni objekat Za svaki operator se definie:

    da li zahteva kao operand(e) lvrednost(i) i da li vraa lvrednost kao rezultat

    Operatori iji operandi moraju da budu lvrednosti: unarni &, ++ i --, kao i levi operandi svih operatora dodele

    Operatori iji su rezultati lvrednosti: *,[], prefiksni ++ i --, kao i operatori dodele

  • 12.10.2010.Proirenja jezika C5

    Primeri lvrednostiint i=0; // i je lvrednostint *p=&i; // p je lvrednost*p=7; // *p je lvrednostint *q[100];q[10]=&i; // q[10] je lvrednost*q[10]=1; // *q[10] je lvrednostq=&i; // ! GRESKA: ime niza nije promenljiva lvrednostint a=1,b=2,c=3;(a=b)=c; // (a=b) je lvrednost(a+b)=c; // ! GRESKA:(a+b) nije lvrednost++ ++i; // ++(++i)i++ ++; // ! GRESKA: postinkrement ne daje lvrednostlong x=5; int y=0,z=0;(x?y:z)=1; // x?y=1:z=1;(x?10:z)=2; // !GRESKA: 10 nije lvrednost

  • 12.10.2010.Proirenja jezika C6

    Oblast vaenja (doseg)

    Oblast vaenja (doseg, scope) imena: onaj deo teksta programa u kome se deklarisano ime moe koristiti

    Globalna imena: imena koja se deklariu van svih funkcija i klasa oblast vaenja: deo teksta od mesta deklaracije do kraja datoteke

    Lokalna imena: imena deklarisana unutar bloka, ukljuujui i blok tela funkcije oblast vaenja: od mesta deklarisanja, do zavretka dotinog bloka

    Sakrivanje imena: ako se redefinie u unutranjem bloku,

    ime iz spoljanjeg bloka je sakriveno do izlaska iz unutranjeg Pristup sakrivenom globalnom imenu:

    navoenjem operatora :: ispred imena Pristup sakrivenom imenu spoljanjeg bloka nije mogu

  • 12.10.2010.Proirenja jezika C7

    Primer dosega i sakrivanja

    int x=0; // globalno xvoid f () {int y=x, // lokalno y, globalno x;

    x=y; // lokalno x, sakriva globalno xx=1; // pristup lokalnom x::x=5; // pristup globalnom x{int x; // lokalno x, sakriva prethodno xx=2; // pristup drugom lokalnom x

    }x=3; // pristup prvom lokalnom x

    }int *p=&x; // uzimanje adrese globalnog x

  • 12.10.2010.Proirenja jezika C8

    Neki specifini dosezi

    U naredbi for umesto izraz0 u jeziku C, u jeziku C++ nalazi se naredba moe da bude definicija promenljive

    Po standardu, promenljiva definisana na taj nain (broja petlje) jelokalna promenljiva for naredbe

    Neki prevodioci (npr. MS VC++ v.6) takvu promenljivu smatrajudefinisanom za blok u kome se nalazi for

    U uslovu if se moe definisati celobrojna ili pokazivaka promenljiva doseg je do kraja then, odnosno else bloka

    if (int k=i+j){}else{} Formalni argumenti funkcije:

    kao lokalne promenljive deklarisane u bloku tela funkcije:void f (int x){int x;} // ! GRESKA

  • 12.10.2010.Proirenja jezika C9

    Primer dosega brojaa petlje forfor (int i=0; i=0; i--) cout

  • 12.10.2010.Proirenja jezika C10

    Doseg klase i funkcije

    Oblast vaenja klase imaju svi lanovi klase to su imena deklarisana unutar definicije klase

    Imenu koje ima oblast vaenja klase, van te oblasti,moe se pristupiti preko operatora: ., gde je levi operand objekat, ->, gde je levi operand pokaziva na objekat, ::, gde je levi operand ime klase

    Oblast vaenja funkcije imaju samo labele(za goto naredbe)

    labele se mogu navesti bilo gde unutar tela funkcije,a u dosegu su u celoj funkciji

  • 12.10.2010.Proirenja jezika C11

    Primer dosega klase

    class X {public: // ili:int x; // void f();void f(); // int x;};void X::f () {/*...*/} // :: proirenje dosegavoid g(){

    X xx, *px;px=&xx;xx.x=0; // moze: xx.X::x; ali nema potrebexx.f(); // moze: xx.X::f(); ali nema potrebepx->x=1;px->f();

    }

  • 12.10.2010.Proirenja jezika C12

    ivotni vek objekata

    ivotni vek objekta: vreme u toku izvravanja programau kojem objekat postoji i za koje mu se moe pristupati

    Na poetku ivotnog veka, objekat se kreira poziva se njegov konstruktor, ako ga ima

    Na kraju ivotnog veka se objekat unitava poziva se njegov destruktor, ako ga ima

  • 12.10.2010.Proirenja jezika C13

    Vrste objekata po ivotnom veku

    Po ivotnom veku, objekti se dele na: statike automatske dinamike tranzijentne (privremene)

    Vek atributa klase = vek objekta kojem pripadaju Vek formalnog argumenta = vek automatskog objekta

    inicijalizuju se vrednostima stvarnih argumenata semantika ista kao kod inicijalizacije objekta u definiciji

  • 12.10.2010.Proirenja jezika C14

    Statiki i automatski objekti

    Automatski objekat je lokalni objekat koji nije deklarisan kao static ivotni vek: od njegove definicije, do naputanja oblasti vaenja kreira se iznova pri svakom pozivu bloka u kome je deklarisan prostor za automatske objekte se alocira na stack-u

    Statiki objekat je globalni objekat ili lokalni deklarisan kao static ivotni vek: od izvravanja definicije do kraja izvravanja programa globalni statiki objekti

    kreiraju se samo jednom, na poetku izvravanja programa kreiraju se pre korienja bilo koje funkcije ili objekta iz istog fajla nije obavezno da se kreiraju pre poziva funkcije main() prestaju da ive po zavretku funkcije main()

    lokalni statiki objekti poinju da ive pri prvom nailasku toka programa na njihovu definiciju

  • 12.10.2010.Proirenja jezika C15

    Primer

    int a=1;void f() {int b=1; // inicijalizuje se pri svakom pozivustatic int c=1; // inicijalizuje se samo jednomcout

  • 12.10.2010.Proirenja jezika C16

    Dinamiki i privremeni objekti

    Dinamiki objekti se kreiraju i unitavaju posebnim operacijama ivotni vek dinamikih objekata neposredno kontrolie programer oni se kreiraju operatorom new, a ukidaju operatorom delete prostor za dinamike objekte se alocira na heap-u

    Privremeni objekti se kreiraju pri izraunavanju izraza ivotni vek privremenih objekata je kratak i nedefinisan privremeni objekti slue za:

    odlaganje meurezultata privremeno smetanje vraene vrednosti funkcije

    najee se unitavaju im vie nisu potrebni

  • 12.10.2010.Proirenja jezika C17

    Leksiki elementi

    Komentari: /* ... */ - u vie redova, kao u jeziku C // ... - do kraja reda, novi u jeziku C++

    Kljune rei: 64 (28 novih u odnosu na C)

    Identifikatori: konvencija: ne treba zapoinjati sa _ i __

    imena u biblioteci C poinju _ imena u biblioteci C++ poinju __

  • 12.10.2010.Proirenja jezika C18

    Tipizacija

    C++ je hibridan jezik: u manipulisanju primitivnim tipovima je labavo tipiziran u manipulisanju klasnim tipovima je strogo tipizirani jezik,

    to je u duhu njegove objektne orijentacije Stroga tipizacija:

    svaki objekat ima svoj tano odreeni tip tipovi se ne mogu proizvoljno zamenjivati

    Konverzija tipa: ako se na nekom mestu oekuje objekat jednog,

    a koristi se objekat drugog tipa, potrebna je konverzijachar f(float i, float j) { /* ... */ }int k=f(5.5,5); // najpre konverzija (float)5,

    // a posle konv. rez. char u int

  • 12.10.2010.Proirenja jezika C19

    Kada je potrebna konverzija?

    Sluajevi kada je potrebno vriti konverziju su: operatori za ugraene tipove

    zahtevaju operande odgovarajueg tipa naredbe (if, for, do, while, switch)

    zahtevaju izraze odgovarajueg tipa pri inicijalizaciji objekta jednog tipa pomou objekta drugog tipa

    pri definisanju objekata i njihovoj inicijalizaciji pri pozivu funkcije,

    kada su stvarni argumenti drugaijeg tipa od formalnih argumenata pri povratku iz funkcije,

    ako je izraz iza return drugaijeg tipa od tipa rezultata funkcije privremeni objekat koji prihvata vrednost funkcije

    se inicijalizuje vrednou izraza iza return

  • 12.10.2010.Proirenja jezika C20

    Vrste konverzije tipova

    Konverzija tipa moe biti: standardna ugraena u jezik ili korisnika definie je programer za svoje tipove

    Standardne konverzije su, na primer: konverzije iz tipa int u tip float, ili iz tipa char u tip int, i sl.

    Konverzija tipa moe biti: implicitna prevodilac je automatski vri, ako je dozvoljena eksplicitna zahteva programer

    Jedan nain zahtevanja eksplicitne konverzije: pomou C operatora kast (cast): (tip)izraz

    Jezik C++ uvodi 4 specifina kast operatora Postoji i drugi mehanizam konverzije (konverzioni konstruktor)

  • 12.10.2010.Proirenja jezika C21

    Konstante

    Konstantni tip je izvedeni tip dobija se iz nekog osnovnog tipa pomou specifikatora const zadrava sve osobine osnovnog tipa, samo se podatak ne moe menjati primeri: const float pi=3.14; const char plus='+';

    Konstanta mora da se inicijalizuje pri definisanju Prevodilac esto ne odvaja memorijski prostor za konstantu Konstante mogu da se koriste u konstantnim izrazima

    koje prevodilac treba da izrauna u toku prevoenja na primer, konstante mogu da se koriste u izrazima koji definiu dimenzije nizova

    Umesto simbolikih konstanti koje se uvode sa #definepreporuka je koristiti tipizirane konstante koje se uvode sa const

    Dosledno korienje konstanti u programuobezbeuje podrku prevodioca u spreavanju greaka

  • 12.10.2010.Proirenja jezika C22

    Konstante i pokazivai

    Pokaziva na konstantu: re const ispred cele definicije Konstantni pokaziva: rei const ispred imena pokazivaa

    const char *pk="asdfgh";// pokazivac na konstantupk[3]='a'; // ! GRESKApk="qwerty"; // ispravno

    char *const kp="asdfgh";// konstantni pokazivackp[3]='a'; // ispravnokp="qwerty"; // ! GRESKA

    const char *const kpk="asdfgh";kpk[3]='a'; // ! GRESKAkpk="qwerty"; // ! GRESKA

  • 12.10.2010.Proirenja jezika C23

    Konstante i funkcije

    const ispred formalnog argumenta koji je pokaziva,obezbeuje da fukcija ne menja objekat:

    char *strcpy(char *p, const char *q); const ispred tipa rezultata funkcije, obezbeuje nepromenljivost

    privremenog objekta rezultata Za vraenu vrednost koja je pokaziva na konstantu,

    ne moe se preko vraenog pokazivaa menjati objekat:const char* f();*f()='a'; // ! GRESKA

  • 12.10.2010.Proirenja jezika C24

    Znakovne konstante

    U jeziku C su tipa int U jeziku C++ su tipa char

    u jeziku C su A i 65 ista konstanta,a u C++ samo imaju istu numeriku vrednost(ako se koristi ASCII skup znakova)

    iako su konstante tipizirane, u izrazima se mogu zamenjivati:int i='A';char c=65;

  • 12.10.2010.Proirenja jezika C25

    Logiki tip podataka

    Kljuna re bool za uvoenje podataka logikog tipa Logiki tip je u grupi celobrojnih tipova Vednosti: true i false U izrazima:

    false se konvertuje u 0, true se konvertuje u 1

    Pri dodeli vrednosti logikoj promenljivoj: 0 se konvertuje u false, nenulta vrednost u true

  • 12.10.2010.Proirenja jezika C26

    Tipovi enum, struct i union Identifikatori nabrajanja, struktura i unija mogu da se

    koriste kao identifikatori tipa nije potrebna kljuna re enum, struct, union

    Ako u dosegu postoji objekat sa istim identifikatorom,sam identifikator oznaava objekat

    tada se identifikator tipa pie kao i na jeziku C,sa odgovarajuom kljunom rei enum, struct, union

  • 12.10.2010.Proirenja jezika C27

    Tip nabrajanja

    Svako nabrajanje na jeziku C++ je poseban celobrojni tip Tip nabrajanja definie niz simbolikih konstanti Za podatke tipa nabrajanja definisana je samo operacija

    dodele vrednosti nabrajanja promenljivoj istog tipa eksplicitna konverzija celobrojne vrednosti u tip nabrajanja je obavezna greka ako konvertovana vrednost nema odgovarajuu konstantu u nabrajanju

    Pri korienju objekata tipa nabrajanja u aritmetikim i relacijskim izrazima,automatski se vri konverzija u intenum Dani { PO=1,UT,SR,CE,PE,SU,NE };Dani dan=SR;dan++; // ! GRESKAdan=(Dani)(dan+1); // implicitna promocija dan u int,

    // pa eksplicitna konverzija rezultataif (dan

  • 12.10.2010.Proirenja jezika C28

    Bezimena unija

    Unija bez imena predstavlja jedan objekat koji sadri uraznim trenucima podatke razliitih tipova

    Identifikatori lanova imaju datoteni ili blokovski doseg,a ne strukturni kao kod unije sa imenom

    lanovi bezimenih unija: koriste se kao obine promenljive

    union{ int i; double d; char *pc; };i=55; d=123.456; pc="ABC";

    Unija za koju je definisan barem jedan objekat ili pokaz.,ne smatra se bezimenom iako nema ime

  • 12.10.2010.Proirenja jezika C29

    Dinamiki objekti

    Operator new kreira jedan dinamiki objekat nekog tipa T Operator delete unitava dinamiki objekat nekog tipa T Operand operatora new je identifikator tipa T

    sa eventualnim inicijalizatorima (argumentima konstruktora) Operator new:

    alocira potreban prostor u memoriji za objekat datog tipa zatim poziva konstruktor tipa

    Ako nema dovoljno prostora izuzetak bad_alloc (zaglavlje ) pre standarda rezultat NULL

    Operator new vraa pokaziva na dati tip:int *ip = new int;Complex *pc1 = new Complex(1.3,5.6);

    Dinamiki objekat nastaje kada se izvri operacija new,a traje sve dok se ne izvri operacija delete

  • 12.10.2010.Proirenja jezika C30

    Unitavanje dinamikih objekata

    Operator delete ima jedan argument tipa pokazivaa nekog tipa Ovaj pokaziva mora da ukazuje na objekat kreiran pomou new

    ako pokaziva ne ukazuje na objekat kreiran pomou new,posledice delete su nepredvidive

    ako je pokaziva NULL, delete samo nema efekta Operator delete

    poziva destruktor za objekat na koji ukazuje pokaziva zatim oslobaa zauzeti prostor

    Operator delete vraa void (bez rezultata)Complex *pc;void f() { pc=new Complex(0.1,0.2); }void main () { f(); delete pc; }

  • 12.10.2010.Proirenja jezika C31

    Dinamiki nizovi

    Operatorom new moe se kreirati i niz objekata nekog tipa:Complex *pc = new Complex[10];

    Operator new vraa pokaziva na prvi element alociranog niza Kada se alocira niz, nije mogue zadati inicijalizatore Ako klasa (elementa niza) nema definisan konstruktor,

    prevodilac obezbeuje podrazumevani konstruktor Dinamiki niz ukida se operatorom delete sa parom uglastih zagrada:

    delete [] pc; Sve dimenzije niza osim prve treba da budu konstantni izrazi Prva dimenzija moe da bude i promenljivi izraz Promenljiv izraz mora biti takav da moe da se izrauna

    u trenutku izvravanja naredbe sa operatorom new

  • 12.10.2010.Proirenja jezika C32

    Reference (upuivai)

    U jeziku C prenos argumenata u funkciju - iskljuivo po vrednosti (by value) Da bi funkcija mogla da promeni vrednost spoljne promenljive,

    trebalo je preneti pokaziva na tu promenljivu, pa indirektno adresirati u f-ji C++ uvodi izvedeni tip reference (upuivaa) na objekat U jeziku C++ mogu je i prenos argumenta po adresi (by reference)

    void f(int i, int &j){ // i po vrednosti, j po referencii++; // stvarni argument se nee promenitij++; // stvarni argument e se promeniti

    }void main () {int si=0,sj=0;f(si,sj);cout

  • 12.10.2010.Proirenja jezika C33

    Definisanje referenci

    Reference se deklariu upotrebom znaka & ispred imena Referenca je alternativno ime za neki objekat (alias, sinonim) U definiciji referenca mora da se inicijalizuje objektom na koga e upuivati Od inicijalizacije referenca postaje sinonim za objekat na koga upuuje Svaka operacija nad referencom (ukljuujui i operaciju dodele)

    je operacija nad objektom na koji referenca upuujeint i=1; // celobrojni objekat iint &j=i; // j upuuje na ii=3; // menja se ij=5; // opet se menja iint *p=&j; // isto to i &ij+=1; // isto to i i+=1int k=j; // posredan pristup do i preko referenceint m=*p; // posredan pristup do i preko pokazivaa

  • 12.10.2010.Proirenja jezika C34

    Implementacija referenci

    Referenca je slina konstantnom pokazivau na objekat datog tipa Referenca pri inicijalizaciji dobija vrednost adrese objekta kojim se inicijalizuje Nema naina da se, posle inicijalizacije, vrednost reference promeni Svako obraanje referenci podrazumeva posredni pristup objektu preko reference Posredan pristup preko pokazivaa se vri operatorom *,

    a preko reference bez posebne operacije Uzimanje adrese (operator &) reference vraa adresu objekta na koji ona upuuje

    int &j = *new int(2); // j upuuje na dinamiki objekat 2int *p=&j; // p je pokaziva na isti objekat(*p)++; // objekat postaje 3j++; // objekat postaje 4delete &j; // isto kao i delete p

    Ako je referenca tipa reference na konstantu,objekat na koji ona upuuje se ne sme promeniti preko te reference

    Ne postoje nizovi referenci, pokazivai na reference, ni reference na reference Referenca na pokaziva je dozvoljena, npr.

    int i=5,*p=&i,*&rp=p;

  • 12.10.2010.Proirenja jezika C35

    Funkcije koje vraaju referencu

    Referenca moe i da se vrati kao rezultat funkcije U tom sluaju funkcija treba da vrati referencu na objekat

    koji traje (ivi) i posle izlaska iz funkcije.int& f(int &i){int &r=*new int(i); return r; }// OKint& f(int &i){return *new int(i); } // OKint& f(int &i){return i; } // OKint& f(int &i){int r=i; return r; } // ! GRESKAint& f(int i){return i; } // ! GRESKAint& f(int &i){int r=*new int(i); return r; }// ! GRESKAint& f(int &i){int j=i, &r=j; return r; } // ! GRESKA

    Rezultat poziva funkcije je lvrednost samo ako funkcija vraa referencu

  • 12.10.2010.Proirenja jezika C36

    Neposredno ugraivanje funkcija (1)

    esto se definiu vrlo jednostavne, kratke funkcije na primer, neke samo prosleuju argumente drugim funkcijama vreme koje se troi na prenos argumenata i poziv

    moe biti vee nego vreme izvravanja tela same funkcije Ovakve funkcije se mogu deklarisati uz zahtev

    da se neposredno ugrauju u kd (inline funkcije) telo takve funkcije direktno se ugrauje u kd na mestu poziva funkcije semantika poziva ostaje potpuno ista kao i za obinu funkciju

    Ovakva funkcija deklarie se dodavanjem specifikatora inline :inline int inc(int i) {return i+1;}

  • 12.10.2010.Proirenja jezika C37

    Neposredno ugraivanje funkcija (2)

    Funkcija lanica klase je ugraenaako se definie unutar definicije klase

    Ako se definie izvan definicije klase, funkcija je ugraenakada se ispred njene definicije nalazi re inline:

    class C { class D {int i; int i;public: public:int val () int val();{return i;}

    }; };inline int D::val(){return i;}

  • 12.10.2010.Proirenja jezika C38

    Neposredno ugraivanje funkcija (3)

    Prevodilac ne mora da potuje zahtev za neposredno ugraivanje za korisnika ovo ne predstavlja problem, jer je semantika ista ugraene funkcije samo mogu da ubrzaju program,

    a nikako da izmene njegovo izvravanje Ako se ugraena funkcija koristi u vie datoteka,

    u svakoj datoteci mora da se nae njena potpuna definicija ovo je najbolje sprovesti pomou datoteke-zaglavlja

    u kojoj je definicija funkcije za ugraivanje nedostatak: *.h datoteka ne sadri samo interfejsne

    ve i implementacione elemente (otkriva se poslovna tajna) Ugraene funkcije eliminiu potrebu za makroima:

    #define ()

  • 12.10.2010.Proirenja jezika C39

    Ugraene funkcije umesto makroa

    Makrodefinicija:#define max(i,j)((i)>(j))?(i):(j)

    Makropoziv:max(k++,l++)

    Makroekspanzija:((k++)>(l++))?(k++):(l++)

    Problem: jedan argument se 2x inkrementira Ugraena f-ja:

    inline int max(int i, int j){return i>j?i:j;}

    Ne postoji gornji problem

  • 12.10.2010.Proirenja jezika C40

    Podrazumevane vrednosti argumenata

    C++ podrava podrazumevane vrednosti argumenata u deklaraciji funkcije Formalni argument uzima podrazumevanu vrednost

    ako se pri pozivu funkcije ne navede odgovarajui stvarni argumentComplex::Complex (float r=0, float i=0)

    {real=r; imag=i;}void main () {Complex c1, c2(0), c3(0,0); // sva tri objekta (0,0)

    } Podrazumevane vrednosti su proizvoljni izrazi

    izraunavaju se svaki put pri pozivu funkcije Podrazumevani argumenti mogu da budu samo nekoliko poslednjih iz liste:

    Complex::Complex(float r=0,float i) // ! GRESKA{real=r;imag=i;}

    Complex::Complex(float r,float i=0) // Ispravno;{real=r;imag=i;}

    void main(){Complex c(0);}

  • 12.10.2010.Proirenja jezika C41

    Preklapanje imena funkcija

    esto su potrebne funkcije koje realizuju logiki istu operaciju,samo sa razliitim tipovima argumenata

    Za svaki od tih tipova mora da se realizuje posebna funkcija U jeziku C to bi moralo da se realizuje tako da te funkcije imaju razliita imena,

    to smanjuje itljivost programa U jeziku C++ mogue je definisati vie razliitih funkcija sa istim identifikatorom Ovakav koncept naziva se preklapanje imena funkcija (engl. name overloading) Uslov je da im se razlikuje broj i/ili tipovi argumenata, odnosno potpis funkcije Tipovi rezultata ne moraju da se razlikuju i nije dovoljno da se samo oni razlikuju:

    double max (double i, double j){ return (i>j) ? i : j; }char* max (const char *p, const char *q){ return (strcmp(p,q)>=0)?p:q; }double r=max(1.5,2.5); // max(double,double)double r=max(1,2.5); // (double)1; max(double,double)

    char *q=max("Pera","Mika"); // max(const char*,const char*)

  • 12.10.2010.Proirenja jezika C42

    Razluivanje kod preklapanja imena

    Koja e se funkcija stvarno pozvati, odreuje se u fazi prevoenja mehanizam je potpuno statiki

    Odreivanje se vri prema slaganju potpisa funkcija uporeuje se broj i/ili tipovi stvarnih i formalnih argumenata

    Potrebno da prevodilac moe jednoznano da odredikoja funkcija se poziva

    Pravila za odreivanje koja funkcija se poziva su veoma sloena U praksi se svode samo na dovoljno razlikovanje potpisa funkcija Prevodilac priblino ovako prioritira slaganje tipova argumenata:

    potpuno slaganje tipova, ukljuujui trivijalne konverzije(trivijalne konverzije su npr. iz tipa T[] u tip T*, ili iz T u T& i obrnuto)

    slaganje tipova korienjem standardnih konverzija (npr. char u int) slaganje tipova korienjem korisnikih konverzija

  • 12.10.2010.Proirenja jezika C43

    Operatori i izrazi

    Novi operatori (11): ::, new, delete, .*, >*, typeid, throw, cast operatori (4)

    Postfiksne varijante ++ i imaju vii prioritet Rezultat prefiksnih operatora ++ i je lvrednost Rezultat operatora dodele vrednosti je lvrednost Uslovni izraz je lvrednost

    ako su drugi i trei operand lvrednosti istog tipaint x,a=0,b=0;x?a:b=1; //if(x) a=1; else b=1;

  • 12.10.2010.Proirenja jezika C44

    Pregled operatora (1)

    OperatorAsoc.Br. op.Prior.

    ,21throw12

    = += -= *= /= %= &= ^= |= =23

    ?:34

    ||25

    &&26

    |27

    ^28

    &29

    == !=210

  • 12.10.2010.Proirenja jezika C45

    Pregled operatora (2)

    < >=211

    >212

    + -213

    * / %214

    .* ->*215

    ! ~ ++a -a - + * & (tip) sizeof new delete116a++ a- specificni_cast(4) typeid117

    [] () . ->218

    ::1,219OperatorAsoc.Br. op.Prior.

  • 12.10.2010.Proirenja jezika C46

    Operatori konverzije tipa

    U jeziku C postoji operator za konverziju tipa (engl. cast):(tip)izraz

    Kast operator iz jezika C se moe koristiti, ali se ne preporuuje U jeziku C++ uvode se dodatni specifini kast operatori:

    static_cast (izraz)reinterpret_cast (izraz)const_cast (izraz)dynamic_cast (izraz)

    Neke konverzije tipa su bezbedne, a neke nisu npr. int float jeste bezbedna, ali int char je rizina

    Po pravilu, za nebezbedne konverzije zahteva se eksplicitan kast Notacija je nezgrapna iz dva razloga

    da se lake moe uoiti u tekstu programa da se programeri odvraaju od korienja

    Potreba za eksplicitnom konverzijom signal za preispitivanje projektnih odluka

  • 12.10.2010.Proirenja jezika C47

    Statika konverzija

    Statiki kast je namenjen uglavnom za prenosive konverzije, npr.: izmeu numerikih tipova (raunajui i tip nabrajanja enum) izmeu pokazivaa proizvoljnih tipova i void* nestandardne konverzije (koje definie programer)

    Primenjuje se automatski (implicitno) za bezbedne konverzije,a eksplicitna konverzija je porebna za nebezbedne konverzije, npr.:

    konverziju pokazivaa void* u pokaziva na poznati tip konverziju numerikog tipa u tip nabrajanja (enum)

    Primeri:float a = 5.0; int i = static_cast(a);

    // kao: int i = (int)a;void *p = static_cast(&i);// moze: void* p = &i;

    int *q = static_cast(p);// mora eksplicitni kast

  • 12.10.2010.Proirenja jezika C48

    Reinterpretirajua konverzija

    Reinterpretirajui kast je namenjen konverziji tipovabez logike veze, npr:

    izmeu celobrojnih vrednosti i pokazivaa izmeu pokazivaa ili referenci na razne tipove

    Sutina je da nema pretvaranja vrednostive se samo ista vrednost razliito interpretira

    Konverzija nije bezbedna i malo je verovatno da je prenosiva Primeri:

    int i = 1155;short *p = reinterpret_cast(i);int j = reinterpret_cast(p); // j==ifloat *q = reinterpret_cast(&i);float &r = reinterpret_cast(i);

  • 12.10.2010.Proirenja jezika C49

    Konstantna konverzija

    Konstantni kast je namenjen uklanjanju ili dodavanju const i volatile Dodavanje specifikatora je bezbedno, ali uklanjanje nije

    jer omoguava promenu vrednosti konstante Primeri:

    int j = 1; const int i = j;int *p = const_cast(&i); // mora eksplicitno*p = 0; // promena konstantnog podatkadouble pi = 3.14;const double &cpi = const_cast(pi);

    // ili: const double &cpi=pi;pi = 0.0; // OKcpi = 0.0; // ! GRESKA