02 prosirenja c
DESCRIPTION
dsfdTRANSCRIPT
-
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