Professional Documents
Culture Documents
2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja U Jeziku C
2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja U Jeziku C
Sadraj predavanja
Izrazi
Izraz je dio programa koji sadri operande (objekte,
funkcije ili literale nekog tipa), operacije nad tim
operandima i proizvodi rezultat tono definiranog tipa.
Operacije se zadaju pomou operatora ugraenih u
jezik.
Operator moe prihvatiti jedan, dva ili tri operanda
strogo definiranih tipova i proizvesti rezultat koji se
zatim moe koristiti kao operand nekog drugog
operatora. Na ovaj se nain oblikuju sloeni izrazi.
Prioritet operatora definira redoslijed izraunavanja
operacija unutar izraza.
Podrazumijevani redoslijed izraunavanja moe se
promijeniti pomou zagrada ().
5
Izrazi
Mnogi ugraeni operatori slue promjeni vrijednosti
nekog od svojih operanada.
Postoje operatori za inkrementiranje (++) i
dekrementiranje (--), u prefiksnoj i postfiksnoj formi.
Ako je i numeriki tip podataka ili pokaziva
i++ znai "inkrementiraj i, a kao rezultat vrati njegovu staru
vrijednost";
++i znai "inkrementiraj i, a kao rezultat vrati njegovu novu
vrijednost".
Analogno vrijedi za dekrementiranje.
Izrazi
If uvjetno grananje
If-else grananje na dva nezavisna programska bloka
Uvjetni operator ?
Switch grananje na vie nezavisnih programskih blokova
Selekcija tipa IF
10
Selekcija tipa ?
uvjet ? izraz1 : izraz2 ;
----------------------------------------------
11
12
13
15
16
17
Naredbe preskoka
18
Polja
Polje je objekt sainjen od objekata istog tipa.
Polje objekata sa identifikatorom T oznaava se sa T[].
Pokazivai
Pokaziva je objekt koji sadri adresu objekta na koji
pokazuje.
Ako pokaziva p pokazuje na objekt x, onda izraz *p
oznaava objekt x (operacija dereferenciranja
pokazivaa).
Rezultat izraza &x je pokaziva koji ukazuje na objekt x
(operacija dohvaanja adrese).
Tip "pokaziva na tip T" oznaava se sa T*.
20
Pokazivai
Na jednak se nain mogu kreirati pokazivai na
odreeni tip.
Ako je p pokaziva koji pokazuje na objekt klase sa
lanom m, onda je (*p).m isto to i p->m:
Pokazivai
Pokaziva tipa void* moe pokazivati na objekt bilo
kojeg tipa.
Pokaziva koji sadri vrijednost 0 (null-pokaziva) ne
pokazuje ni na jedan objekt.
22
24
Funkcije
Funkcije ili potprogrami mogu biti lanice klase ili globalne funkcije
(nisu lanice nijedne klase).
Ne postoji statiko (sintaksno) ugnjeivanje tijela funkcija.
Dinamiko ugnjeivanje poziva funkcija je dozvoljeno ukljuujui i
rekurziju (funkcija poziva samu sebe).
Funkcija moe, ali ne mora da ima argumente. Funkcija bez
argumenata se deklarira sa praznim zagradama.
Argumenti se prenose samo po vrijednostima u jeziku C, a mogu
se prenositi i po referenci u jeziku C++.
Funkcija moe, ali ne mora vratiti rezultat.
Funkcija koja nema povratnu vrijednost deklarira se sa tipom void
kao tipom rezultata.
Deklaracija funkcije koja nije definicija ukljuuje samo zaglavlje sa
tipom argumenata i rezultata; imena argumenata su opcionalna i
nemaju znaaj za program.
Definicija funkcije se sastoji i od tijela odnosno bloka naredbi. 25
Funkcije
26
Funkcije
Funkcija lanica neke klase moe pristupati lanovima vlastitog
objekta bez posebne specifikacije.
Globalna funkcija mora specificirati objekt ijem lanu pristupa.
Poziv funkcije obavlja se pomou operatora ().
Rezultat ove operacije je rezultat poziva funkcije.
27
Funkcije
Moe se deklarirati i pokaziva na funkciju:
28
Funkcije
Funkcije se deklariraju i definiraju kao i u jeziku C, samo to je
mogue kao tipove argumenata i rezultata navesti korisnike tipove
(klase).
U deklaraciji funkcije ne moraju se navoditi imena formalnih
argumenata.
Pri pozivu funkcije, usporeuju se tipovi stvarnih argumenata sa
tipovima formalnih argumenata navedenim u deklaraciji te se prema
potrebi vri konverzija.
Semantika prijenosa argumenata jednaka je semantici inicijalizacije.
Kod poziva funkcije, inicijaliziraju se formalni argumenti, kao
automatski lokalni objekti pozvane funkcije.
Ovi objekti se konstruiraju pozivom odgovarajuih konstruktora, ako
ih ima.
Kod vraanja vrijednosti iz funkcije, semantika je ista: konstruira se
privremeni objekt koji prihvaa vraenu vrijednost na mjestu poziva.
29
Funkcije
30
Funkcije
esto se definiraju vrlo jednostavne, kratke funkcije (na primjer
samo prosljeuju argumente drugim funkcijama).
Tada je vrijeme koje se troi na prijenos argumenata i poziv vee
nego vrijeme izvravanja tijela funkcije.
Ovakve funkcije se mogu deklarirati tako da se neposredno
ugrauju u kd (inline funkcije).
Tada se tijelo funkcije direktno ugrauje u kd koji se poziva.
Semantika poziva ostaje potpuno ista kao i za obinu funkciju.
Ovakva funkcija deklarire se kao inline:
31
Funkcije
Funkcija lanica klase moe biti inline ako se definira unutar
deklaracije klase, ili izvan deklaracije klase, kada se ispred njene
deklaracije nalazi rije inline:
32
Funkcije
33
Funkcije
34
Funkcije
Koja e se funkcija stvarno pozvati, odreuje se u fazi prevoenja
prema slaganju tipova stvarnih i formalnih argumenata.
Zato je potrebno da prevoditelj moe jednoznano odrediti koja
funkcija se poziva.
Pravila za razrjeavanje poziva su vrlo sloena, pa se u praksi
svode samo na dovoljno razlikovanje tipova formalnih argumenata
preklopljenih funkcija.
Kada razrjeava poziv, prevoditelj otprilike ovako prioritizira
slaganje tipova stvarnih i formalnih argumenata:
najbolje odgovara potpuno slaganje tipova; tipovi T* (pokaziva na T)
i T[] (niz elemenata tipa T) se ne razlikuju;
sljedee po odgovaranju je slaganje tipova koritenjem standardnih
konverzija;
sljedee po odgovaranju je slaganje tipova koritenjem korisnikih
konverzija;
najloije odgovara slaganje sa tri toe (...).
35
36
odgovarajueg tipa;
(2) Neke kontrolne strukture (if, for, do, while, switch) zahtijevaju
izraze odgovarajueg tipa;
(3) Kod poziva funkcije, kada su stvarni argumenti drugaijeg tipa
od deklariranih formalnih argumenata te kad su operatori za
korisnike tipove (klase) specijalne vrste funkcija.
(4) Kod povratka iz funkcije, ako se u izrazu iza return koristi izraz
drugaijeg tipa od deklariranog tipa povratne vrijednosti funkcije;
(5) Kod inicijalizacije objekta jednog tipa pomou objekta drugog
tipa; sluaj pod (3) se moe uvrstiti u ovu grupu jer se formalni
argumenti inicijaliziraju stvarnim argumentima pri pozivu funkcije.
Takoer, sluaj pod (4) se moe uvrstiti u ovu grupu, jer se
privremeni objekt, koji prihvaa vraenu vrijednost funkcije na
mjestu poziva, inicijalizira izrazom iza naredbe return.
37
Struktura programa
Program se sastoji samo od deklaracija (klasa, objekata, ostalih
tipova i funkcija).
Sva obrada vri se unutar tijela funkcija.
Program se fiziki dijeli na odvojene jedinice prevoenja datoteke.
Datoteke se prevode odvojeno i nezavisno, a zatim se povezuju u
izvrni program.
Prije koritenja, u svakoj se datoteci moraju deklarirati svi objekti.
Zavisnosti izmeu datoteka definiraju se pomou datotekazaglavlja.
Zaglavlja sadre deklaracije svih entiteta koji se koriste u pojedinoj
datoteci, a definirani su u nekom drugoj datoteci.
Zaglavlja (.h) se ukljuuju u tekst datoteke koja se prevodi (.cpp)
pomou naredbe #include.
Glavni program (izvor kontrole toka) definira se kao obavezna
39
funkcija main.
Struktura programa
40
Struktura programa
41
Doseg identifikatora
Doseg identifikatora je onaj dio programa u kome se deklarirani
identifikator moe koristiti.
Globalni identifikatori se deklariraju van svih funkcija i klasa.
Njihov doseg je dio teksta od mjesta deklaracije do kraja datoteke.
Lokalni identifikatori su deklarirani unutar bloka, ukljuujui i blok
tijela funkcije.
Njihov doseg je od mjesta gdje su deklarirani, do zavretka bloka u
kome su deklarirani.
42
Doseg identifikatora
Globalnom identifikatoru se moe pristupiti, iako je sakriveno,
navoenjem operatora "::" ispred identifikatora:
43
Doseg identifikatora
Doseg klase odnosi se na sve njene lanove
To su identifikatori deklarirani unutar deklaracije klase.
Identifikator koji ima doseg klase, van tog dosega, moe se
pristupati preko operatora "." i "->", gdje je lijevi operand objekt,
odnosno pokaziva na objekt klase ili klase izvedene iz nje, ili
preko operatora "::", gdje je lijevi operand ime klase
Doseg funkcije imaju samo oznake (za goto naredbu preskoka).
One se mogu navesti bilo gdje (i samo) unutar tijela funkcije, a
vide se u cijeloj funkciji.
44
Objekti i lvrijednosti
Objekti i lvrijednosti
46
47
49
50
51
Konstante
Konstantni tip je izvedeni tip koji se iz nekog osnovnog tipa dobiva
stavljanjem specifikatora const u deklaraciju
Konstantni tip ima sve osobine osnovnog tipa, samo se objekti
konstantnog tipa ne mogu mijenjati.
Pristup konstantama kontrolira se u fazi prevoenja, a ne
izvravanja.
Konstanta se mora inicijalizira za vrijeme definiranja.
Prevoditelj esto ne odvaja memorijski prostor za konstantu, ve
njeno koritenje rjeava tijekom prevoenja.
Konstante se mogu koristiti u izrazima koje prevoditelj treba
izraunati za vrijeme prevoenja, npr. dimenzije polja.
Pokaziva na konstantu definira se stavljanjem rijei const ispred
cijele definicije.
Konstantni pokaziva definira se stavljanjem rijei const ispred
samog imena.
52
Konstante
Navoenjem rijei const ispred deklaracije formalnog
argumenta funkcije koji je pokaziva, osigurava se da funkcija
ne moe mijenjati objekt na koji taj argument pokazuje.
Navoenjem rijei const ispred tipa koji vraa funkcija, definira
se da e privremeni objekt koji se kreira od vraene vrijednosti
funkcije biti konstantan i njegovu upotrebu kontrolira
prevoditelj.
Za povratnu vrijednost koja je pokaziva na konstantu, ne
moe se preko vraenog pokazivaa mijenjati objekt.
Preporuka je da se umjesto tekstualnih konstanti koje se
ostvaruju pretprocesorom (kao u jeziku C) koriste konstante na
opisani nain.
Dosljedno koritenje konstanti u programu osigurava
korektnost konstantnosti (predstavlja podrku prevoditelja u
spreavanju nastanka greaka).
53
Konstante
54
Dinamiki objekti
Operator new kreira jedan dinamiki objekt, a operator delete
ukida dinamiki objekt nekog tipa T.
Operator new za svoj argument ima identifikator tipa i eventualne
argumente konstruktora.
Operator new alocira potreban prostor u slobodnoj memoriji za
objekt odreenog tipa, a zatim poziva konstruktor tipa sa zadanim
vrijednostima.
Operator new vraa pokaziva na dani tip:
55
Dinamiki objekti
Objekt kreiran pomou operatora new naziva se dinamiki objekt,
jer mu je ivotni vijek poznat tek u vrijeme izvravanja.
Ovakav objekat nastaje kada se izvri operator new, a traje sve
dok se ne oslobodi operatorom delete (moe egzistirati i po
zavretku bloka u kome je kreiran):
56
Dinamiki objekti
Operator delete ima jedan argument koji je pokaziva na neki tip.
Ovaj pokaziva mora pokazivati na objekt kreiran pomou
operatora new.
Operator delete poziva destruktor za objekt na koji pokazuje
pokaziva, a zatim oslobaa zauzeti prostor.
Ovaj operator vraa void.
Operatorom new moe se kreirati i niz objekata nekog tipa.
Ovakav niz ukida se operatorom delete sa parom uglatih zagrada.
57
Dinamiki objekti
Kada se alocira polje, nije mogue zadati inicijalizatore.
Ako klasa nema definiran konstruktor, prevoditelj
osigurava podrazumijevanu inicijalizaciju.
Ako klasa ima konstruktore, da bi se alociralo polje
potrebno je da postoji konstruktor koji se moe pozvati
bez argumenata.
Kada se alocira polje, operator new vraa pokaziva na
prvi element alociranog polja.
Sve dimenzije polja osim prve trebaju biti konstantni
izrazi, a prva dimenzija moe da bude i varijabilni izraz
na nain da se moe izraunati u trenutku izvravanja
naredbe sa operatorom new.
58
Reference
U jeziku C prijenos argumenata u funkciju bio je iskljuivo po
vrijednosti (call by value).
Da bi neka funkcija mogla promijeniti vrijednost neke Vanjske
varijable, trebalo je prenijeti pokaziva na tu varijablu.
U jeziku C++ mogu je i prijenos po referenci (call by reference):
59
Reference
U jeziku C prijenos argumenata u funkciju bio je iskljuivo po
vrijednosti (call by value).
Da bi neka funkcija mogla promijeniti vrijednost neke Vanjske
varijable, trebalo je prenijeti pokaziva na tu varijablu.
U jeziku C++ mogu je i prijenos po referenci (call by reference):
60
Reference
61
Reference
Referenca se realizira kao (konstantni) pokaziva na objekt.
Ovaj pokaziva pri inicijalizaciji dobiva vrijednost adrese objekta
kojim se inicijalizira.
Svako dalje obraanje referenci podrazumijeva posredni pristup
objektu preko ovog pokazivaa.
Nema naina da se, nakon inicijalizacije, vrijednost ovog
pokazivaa promijeni.
Referenca je slina pokazivau, ali se posredan pristup preko
pokazivaa na objekt vri operatorom *, a preko reference bez
oznaka.
Dohvaanje adrese (operator &) reference znai dohvaanje
adrese objekta na koji ona pokazuje.
62
Reference
Ako je referenca tipa reference na konstantu, onda to znai da se
referencirani objekt ne smije promijeniti posredstvom te reference.
Referenca se moe vratiti i kao rezultat funkcije.
Da bi se mogla koristiti ta referenca, funkcija treba vratiti
referencu na objekt koji egzistira i poslije izlaska iz funkcije.
Prilikom poziva funkcije, kreiraju se objekti koji predstavljaju
formalne argumente i inicijaliziraju se stvarnim argumentima
(semantika je ista kao i kod definiranja objekta sa inicijalizacijom).
Prilikom povratka iz funkcije, kreira se privremeni objekt koji se
inicijalizira objektom koji se vraa, a zatim se koristi u izrazu iz
koga je funkcija pozvana.
Rezultat poziva funkcije je lvrijednost samo ako funkcija vraa
referencu.
Ne postoje polja referenci, pokazivai na reference, ni reference na
reference.
63
Reference
64
Slogovi
Slog je mehanizam agregacije u kojem se povezuje vie podataka
koji mogu imati meusobno razliite tipove.
Svaki podatak unutar sloga naziva se komponenta sloga.
Komponenti sloga se pristupa preko njenog imena.
Sintaksa:
struct ime_strukture {
opis_komponenti
} deklaracije varijabli;
Komponente strukture se deklariraju po istim pravilima po kojima
se deklariraju varijable.
Iza zatvorene vitiaste zagrade navode se identifikatori (imena)
varijabli koje e kao tip podataka imati sloeni tip definiran
strukturom.
Ime strukture koristi se kao ime tipa podataka kojim e se kasnije
65
u programu moi deklarirati varijable.
Slogovi
66
Unije
U programskom jeziku C++ postoji mehanizam agregacije koji
omoguuje da se alternativni podaci uvaju u istom memorijskom
prostoru. Taj se mehanizam naziva unija.
Sintaksa:
union ime unije {
alternativni podaci
} identifikatori varijabli;
Deklaracija unije u potpunosti je jednaka po sintaksi i svojstvima
kao i deklaracija strukture, osim u kljunoj rijei union koja se
koristi umjesto kljune rijei struct.
67