Download as pdf or txt
Download as pdf or txt
You are on page 1of 69

SUVREMENE TEHNIKE PROGRAMIRANJA

IMPLEMENTACIJA TEMELJNIH KONCEPATA


OOP U PROGRAMSKOM JEZIKU C++
DRUGO PREDAVANJE

Sadraj predavanja

Ugraeni tipovi i deklaracije


Izrazi
Kontrola toka programa
Polja
Pokazivai
Funkcije
Konverzija tipova podataka
Struktura programa
Doseg identifikatora
Objekti i lvrijednosti
ivotni vijek objekta
Konstante
Dinamiki objekti
Slogovi
Unije
2

Ugraeni tipovi i deklaracije


C++ nije isti OO jezik - ugraeni tipovi nisu realizirani
kao klase, ve kao jednostavne strukture podataka.
Objekt (npr. varijabla) je imenovani dio memorije.
Deklaracija je postupak dodjele jednoznanog imena
(identifikatora) memorijskom prostoru u koji e se
pohranjivati vrijednost objekta.
Postupak pridruivanja poetne vrijednosti objektu
naziva se inicijalizacija.
Neki osnovni ugraeni tipovi su: cijeli brojevi (int),
znakovi (char) i racionalni (decimalni) brojevi (float i
double).
Objekt moe biti inicijaliziran u deklaraciji - takva
deklaracija je ujedno i definicija.
3

Ugraeni tipovi i deklaracije

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.

Pridruivanje vrijednosti se vri pomou operatora =


a=b znai "pridrui vrijednost izraza b objektu a, a kao rezultat
vrati pridruenu vrijednost".
Pridruivanje se vri s desna u lijevo.
6

Izrazi

Kontrola toka programa


Sekvenca (slijed) je blok naredbi koje se izvravaju
redoslijedom kojim su napisane.

Selekcija (odabir, grananje) je programski konstrukt u


kojem je izvravanje bloka naredbi povezano sa
istinitou logikog izraza (uvjeta).

If uvjetno grananje
If-else grananje na dva nezavisna programska bloka
Uvjetni operator ?
Switch grananje na vie nezavisnih programskih blokova

Sintaksa selekcija tipa IF


if (logicki izraz)
blok naredbi
---------------------------------------------if (logicki izraz)
blok naredbi 1
else
blok naredbi 2
---------------------------------------------if (logicki izraz 1)
blok naredbi 1
else if (logicki izraz 2)
blok naredbi 2
else
blok naredbi 3
9

Selekcija tipa IF

10

Selekcija tipa ?
uvjet ? izraz1 : izraz2 ;

----------------------------------------------

11

Selekcija tipa SWITCH


switch (cjelobrojni izraz) {
case slucaj 1: blok naredbi
.
.
.
case slucaj n: blok naredbi
default: blok naredbi
}

12

Selekcija tipa SWITCH

13

Kontrola toka programa


Iteracije (petlje, ponavljanja) omoguuju da se neki
programski blok ponavlja vie puta
FOR iteracija sa eksplicitnim brojaem koja se koristi kada
znamo od koliko e se koraka petlja sastojati.
WHILE iteracija bez brojaa koja se koristi kada ne znamo od
koliko e se koraka petlja sastojati.
DO WHILE iteracija kod koje se istinitost uvjeta provjerava
nakon to se programski blok jednom izvri.

Naredbe preskoka potrebno ih je koristiti sa oprezom


GOTO omoguuje preskok do odreene oznake u programu.
RETURN namijenjena vraanju vrijednosti.
CONTINUE preskae preostale naredbe u tijelu petlje i
zapoinje novi korak petlje.
BREAK slui izlazu iz kontrolne strukture.
14

Iteracija tipa FOR


for (inicijalna vrijednost; uvjet zavrsetka; promjena)
blok naredbi
------------------------------------------------------

15

Iteracija tipa WHILE


while (logicki uvjet)
blok naredbi
------------------------------------------------------

16

Iteracija tipa DO-WHILE


do
blok naredbi
while (logicki uvjet);
------------------------------------------------------

17

Naredbe preskoka

18

Polja
Polje je objekt sainjen od objekata istog tipa.
Polje objekata sa identifikatorom T oznaava se sa T[].

Znakovni niz je jednodimenzionalno polje sainjeno od


lanova tipa char iza kojih slijedi \0 (nul-znak).
19

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:

Tip na koji pokaziva pokazuje moe biti proizvoljan


ukljuujui i drugi pokaziva.
Ne postoje objekti tipa void, ali postoje pokazivai tipa
void*.
21

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

Veza izmeu polja i pokazivaa


Svaki put kada se ime polja koristi u nekom izrazu, osim u operaciji
dohvaanja adrese (operator &), isto se implicitno pretvara u
pokaziva na svoj prvi element.
Primjerice, ako je a tipa int[], onda se on pretvara u tip int* sa
vrijednou adrese prvog elementa polja.

Definirana je operacija zbrajanja pokazivaa i cijelog broja, pod


uvjetom da vrijedi:
Pokaziva pokazuje na element nekog polja i rezultat zbrajanja je opet
pokaziva koji pokazuje na element istog polja ili za jedno mjesto iza
posljednjeg elementa polja. Rezultat zbrajanja p+i, gdje je p pokaziva, a i
cijeli broj, je pokaziva koji pokazuje i elemenata iza elementa na koji
pokazuje pokaziva p.

Ako navedeni uvjeti nisu zadovoljeni, rezultat operacije nije


definiran.
Analogna pravila postoje za operacije oduzimanja cijelog broja od
pokazivaa, kao i inkrementiranja i dekrementiranja pokazivaa.
Operacija a[i] je po definiciji ekvivalentna sa *(a+i).
23

Veza izmeu polja i pokazivaa

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

Funkcija moe vratiti vrijednost koja je rezultat izraza u naredbi


return.
Mogu se definirati lokalna imena unutar tijela funkcije (tonije
unutar svakog ugnjedenog bloka)

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

Prevoditelj ne mora ispotovati zahtjev za neposredno ugraivanje u kd.


Za korisnika ovo ne treba predstavljati nikakvu prepreku, jer je semantika
ista.
Inline funkcije samo mogu da ubrzati program, a nikako izmijeniti njegovo
izvravanje.
Ako se inline funkcija koristi u vie datoteka, u svakoj se datoteci mora
nalaziti njena potpuna definicija (najbolje pomou datoteke-zaglavlja).
C++ osigurava i mogunost postavljanja podrazumijevanih vrijednosti za
argumente.
Ako se kod poziva funkcije ne navede argument za koji je definirana
podrazumijevana vrijednost (u deklaraciji funkcije), kao vrijednost
stvarnog argumenta uzima se ta podrazumijevana vrijednost.

33

Funkcije

esto se javlja potreba da se u programu naprave funkcije koje realiziraju


logiki istu operaciju, samo sa razliitim tipovima argumenata.
Za svaki se od tih tipova mora realizirati posebna funkcija.
U jeziku C bi se navedeno moralo realizirati tako da te funkcije imaju
razliita imena to bi smanjilo itljivost programa.
U jeziku C++ mogue je definirati vie razliitih funkcija sa istim
identifikatorom.
Ovakav koncept naziva se preklapanje imena funkcija (engl. function
overloading).
Uvjet je da im se razlikuje broj i/ili tipovi argumenata.

Tipovi rezultata se ne moraju razlikovati.

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

Konverzija tipova podataka


C++ je strogo tipizirani jezik, to je u duhu njegove
objektne orijentacije.
Tipizacija znai da svaki objekt ima svoj tono odreeni
tip.
Svaki put kada se na nekom mjestu oekuje objekt
jednog tipa, a koristi se objekt drugog tipa, potrebno je
izvriti konverziju.
Konverzija tipa znai pretvaranje objekta inicijalnog tipa
u objekt potrebnog tipa.

36

Konverzija tipova podataka


Sluajevi kada je potrebno izvriti konverziju:
(1) Operatori za ugraene tipove zahtijevaju operande

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

Konverzija tipova podataka


Konverzija tipa moe biti ugraena u jezik (standardna
konverzija) ili istu definira korisnik (programer) za svoje
tipove (korisnika konverzija).
Standardne konverzije su, primjerice, konverzije iz tipa
int u tip float, ili iz tipa char u tip int, itd.
Prevoditelj moe sam izvriti konverziju koja mu je
dozvoljena, na mjestu gdje je to potrebno takva se
konverzija naziva implicitnom.
Programer moe eksplicitno navesti koju je konverziju
potrebno izvriti - ova konverzija naziva se
eksplicitnom.
Primjer eksplicitne konverzije je pomou operatora
cast: (tip)izraz
38

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:

Za formalne argumente funkcije smatra se da su lokalni,


deklarirani u vanjskom bloku tijela funkcije:

Prvi izraz u naredbi for moe biti definicija varijable. Tako se


dobiva lokalna varijabla za blok u kome se nalazi for:

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

Objekt je neko podruje u memoriji podataka za vrijeme izvravanja


programa.
Navedeno moe biti varijabla (globalna ili lokalna), privremeni objekt koji
se kreira pri izraunavanja izraza, ili jednostavno memorijska lokacija na
koju pokazuje neki pokaziva.
Objekt je primjerak nekog tipa (ugraenog ili klase), ali ne i funkcija.
U jeziku C++ varijabla je nekonstantni objekt.
Lvrijednost (neto to stoji sa lijeve strane operatora pridruivanja) je
izraz koji upuuje na objekt.
Meutim, ne mogu se sve lvrijednosti (npr. konstante) nalaziti s lijeve
strane operatora =
Za svaki se operator definira da li zahtjeva kao operand lvrijednost te da li
vraa lvrijednost kao rezultat.
"Poetna" lvrijednost je ime objekta ili funkcije. Na taj se nain rekurzivno
definiraju lvrijednosti.
Promjenljiva lvrijednost je ona lvrijednost, koja nije ime funkcije, ime niza,
ili konstantni objekt.
45
Samo ovakva lvrijednost moe biti lijevi operand operatora dodjele.

Objekti i lvrijednosti

46

ivotni vijek objekta

ivotni vijek objekta je vrijeme u tijeku izvravanja programa za koje taj


objekt postoji (u memoriji) te tijekom kojeg mu se moe pristupati.
Na poetku ivotnog vijeka, objekt se kreira (poziva se njegov konstruktor
ako ga ima), a na kraju se objekt ukida (poziva se njegov destruktor ako
ga ima).
Sinonim za kreiranje objekta je inicijalizacija objekta.

47

ivotni vijek objekta


ivotni vijek automatskog objekta (lokalni objekt koji nije
deklariran kao static) traje od nailaska na njegovu definiciju, do
naputanja podruja valjanosti tog objekta. Automatski objekt se
kreira iznova pri svakom pozivu bloka u kome je deklariran.
Definicija objekta je izvrna naredba.
ivotni vijek statikih objekata (globalni i lokalni static objekti)
traje od izvravanja njihove definicije do kraja izvravanja
programa. Globalni statiki objekti se kreiraju samo jednom, na
poetku izvravanja programa, prije koritenja bilo koje funkcije ili
objekta iz iste datoteke, ne obavezno prije poziva funkcije main, a
prestaju egzistirati po zavretku funkcije main. Lokalni statiki
objekti poinju egzistirati pri prvom nailasku toka programa na
njihovu definiciju.
ivotni vijek dinamikih objekata neposredno kontrolira programer.
Oni se kreiraju operatorom new, a ukidaju operatorom delete.
48

ivotni vijek objekta


ivotni vijek privremenih objekata je kratak i nedefiniran. Ovi
objekti se kreiraju pri izraunavanju izraza, za pohranu
meurezultata ili privremenu pohranu povratne vrijednosti
funkcije. Najee se unitavaju kada vie nisu potrebni.
ivotni vijek lanova klase je isti kao i ivotni vijek objekta kome
pripadaju.
Formalni argumenti funkcije se, pri pozivu funkcije, kreiraju kao
automatski lokalni objekti.
Semantika inicijalizacije formalnog argumenta je ista kao i
inicijalizacija objekta u definiciji.

49

ivotni vijek objekta

50

ivotni vijek objekta

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

C++ ide jo dalje, postoji izvedeni tip reference na objekt.


Reference se deklariraju upotrebom znaka & ispred imena.
Referenca je alternativno ime za neki objekat.
Kada se definira, referenca se mora inicijalizirati objektom na
kojeg e pokazivati.
Od tada referenca postaje sinonim za objekt na koga pokazuje i
svaka operacija nad referencom (ukljuujui i operaciju dodjele) je
ustvari operacija nad referenciranim objektom.

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

You might also like