2 - implementacija temeljnih koncepata objektno orijentiranog programiranja u jeziku c

Post on 05-Jan-2016

226 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

stp

TRANSCRIPT

SUVREMENE TEHNIKE PROGRAMIRANJA

IMPLEMENTACIJA TEMELJNIH KONCEPATA OOP U PROGRAMSKOM JEZIKU C++

DRUGO PREDAVANJE

Sadržaj predavanja

• Ugrađeni tipovi i deklaracije

• Izrazi

• Kontrola toka programa

• Polja

• Pokazivači

• Funkcije

• Konverzija tipova podataka

• Struktura programa

• Doseg identifikatora

• Objekti i lvrijednosti

• Životni vijek objekta

• Konstante

• Dinamički objekti

• Slogovi

• Unije

2

Ugrađeni tipovi i deklaracije

• C++ nije čisti OO jezik - ugrađeni tipovi nisu realizirani kao klase, već kao jednostavne strukture podataka.

• Objekt (npr. varijabla) je imenovani dio memorije.

• Deklaracija je postupak dodjele jednoznačnog imena (identifikatora) memorijskom prostoru u koji će se pohranjivati vrijednost objekta.

• Postupak pridruživanja početne vrijednosti objektu naziva se inicijalizacija.

• Neki osnovni ugrađeni tipovi su: cijeli brojevi (int), znakovi (char) i racionalni (decimalni) brojevi (float i double).

• Objekt može biti inicijaliziran u deklaraciji - takva deklaracija je ujedno i definicija.

3

Ugrađeni tipovi i deklaracije

4

Izrazi

• Izraz je dio programa koji sadrži operande (objekte, funkcije ili literale nekog tipa), operacije nad tim operandima i proizvodi rezultat točno definiranog tipa.

• Operacije se zadaju pomoću operatora ugrađenih u jezik.

• Operator može prihvatiti jedan, dva ili tri operanda strogo definiranih tipova i proizvesti rezultat koji se zatim može koristiti kao operand nekog drugog operatora. Na ovaj se način oblikuju složeni izrazi.

• Prioritet operatora definira redoslijed izračunavanja operacija unutar izraza.

• Podrazumijevani redoslijed izračunavanja može se promijeniti pomoću zagrada ().

5

Izrazi

• Mnogi ugrađeni operatori služe promjeni vrijednosti nekog od svojih operanada.

• Postoje operatori za inkrementiranje (++) i dekrementiranje (--), u prefiksnoj i postfiksnoj formi.

• Ako je i numerički tip podataka ili pokazivač

i++ znači "inkrementiraj i, a kao rezultat vrati njegovu staru vrijednost";

++i znači "inkrementiraj i, a kao rezultat vrati njegovu novu vrijednost".

Analogno vrijedi za dekrementiranje.

• Pridruživanje vrijednosti se vrši pomoću operatora =

a=b znači "pridruži vrijednost izraza b objektu a, a kao rezultat vrati pridruženu vrijednost".

Pridruživanje se vrši s desna u lijevo.6

Izrazi

7

Kontrola toka programa

• Sekvenca (slijed) je blok naredbi koje se izvršavaju redoslijedom kojim su napisane.

• Selekcija (odabir, grananje) je programski konstrukt u kojem je izvršavanje bloka naredbi povezano sa istinitošću logičkog izraza (uvjeta).

If – uvjetno grananje

If-else – grananje na dva nezavisna programska bloka

Uvjetni operator ?

Switch – grananje na više nezavisnih programskih blokova8

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 39

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) omogućuju da se neki programski blok ponavlja više puta

FOR – iteracija sa eksplicitnim brojačem koja se koristi kada znamo od koliko će se koraka petlja sastojati.

WHILE – iteracija bez brojača 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 izvrši.

• Naredbe preskoka – potrebno ih je koristiti sa oprezom

GOTO – omogućuje preskok do određene oznake u programu.

RETURN – namijenjena vraćanju vrijednosti.

CONTINUE – preskače preostale naredbe u tijelu petlje i započinje novi korak petlje.

BREAK – služi 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 sačinjen od objekata istog tipa.

• Polje objekata sa identifikatorom T označava se sa T[].

• Znakovni niz je jednodimenzionalno polje sačinjeno od članova tipa char iza kojih slijedi ‘\0’ (nul-znak).

19

Pokazivači

• Pokazivač je objekt koji sadrži adresu objekta na koji pokazuje.

• Ako pokazivač p pokazuje na objekt x, onda izraz *poznačava objekt x (operacija dereferenciranjapokazivača).

• Rezultat izraza &x je pokazivač koji ukazuje na objekt x(operacija dohvaćanja adrese).

• Tip "pokazivač na tip T" označava se sa T*.

20

Pokazivači

• Na jednak se način mogu kreirati pokazivači na određeni 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 može biti proizvoljan uključujući i drugi pokazivač.

• Ne postoje objekti tipa void, ali postoje pokazivači tipa void*.

21

Pokazivači

• Pokazivač tipa void* može pokazivati na objekt bilo kojeg tipa.

• Pokazivač koji sadrži vrijednost 0 (null-pokazivač) ne pokazuje ni na jedan objekt.

22

Veza između polja i pokazivača

• Svaki put kada se ime polja koristi u nekom izrazu, osim u operaciji dohvaćanja 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* savrijednošću adrese prvog elementa polja.

• Definirana je operacija zbrajanja pokazivača 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 icijeli 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 pokazivača, kao i inkrementiranja i dekrementiranja pokazivača.

• Operacija a[i] je po definiciji ekvivalentna sa *(a+i). 23

Veza između polja i pokazivača

24

Funkcije

• Funkcije ili potprogrami mogu biti članice klase ili globalne funkcije (nisu članice nijedne klase).

• Ne postoji statičko (sintaksno) ugnježđivanje tijela funkcija.

• Dinamičko ugnježđivanje poziva funkcija je dozvoljeno uključujući i rekurziju (funkcija poziva samu sebe).

• Funkcija može, 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 može, ali ne mora vratiti rezultat.

• Funkcija koja nema povratnu vrijednost deklarira se sa tipom voidkao tipom rezultata.

• Deklaracija funkcije koja nije definicija uključuje samo zaglavlje sa tipom argumenata i rezultata; imena argumenata su opcionalna i nemaju značaj za program.

• Definicija funkcije se sastoji i od tijela odnosno bloka naredbi. 25

Funkcije

• Funkcija može vratiti vrijednost koja je rezultat izraza u naredbi return.

• Mogu se definirati lokalna imena unutar tijela funkcije (točnije unutar svakog ugnježdenog bloka)

26

Funkcije

• Funkcija članica neke klase može pristupati članovima vlastitog objekta bez posebne specifikacije.

• Globalna funkcija mora specificirati objekt čijem članu pristupa.

• Poziv funkcije obavlja se pomoću operatora ().

• Rezultat ove operacije je rezultat poziva funkcije.

27

Funkcije

• Može se deklarirati i pokazivač na funkciju:

28

Funkcije

• Funkcije se deklariraju i definiraju kao i u jeziku C, samo što je moguće kao tipove argumenata i rezultata navesti korisničke tipove (klase).

• U deklaraciji funkcije ne moraju se navoditi imena formalnih argumenata.

• Pri pozivu funkcije, uspoređuju se tipovi stvarnih argumenata sa tipovima formalnih argumenata navedenim u deklaraciji te se prema potrebi vrši 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 odgovarajućih konstruktora, ako ih ima.

• Kod vraćanja vrijednosti iz funkcije, semantika je ista: konstruira se privremeni objekt koji prihvaća vraćenu vrijednost na mjestu poziva.

29

Funkcije

30

Funkcije

• Često se definiraju vrlo jednostavne, kratke funkcije (na primjer samo prosljeđuju argumente drugim funkcijama).

• Tada je vrijeme koje se troši na prijenos argumenata i poziv veće nego vrijeme izvršavanja tijela funkcije.

• Ovakve funkcije se mogu deklarirati tako da se neposredno ugrađuju u kôd (inline funkcije).

• Tada se tijelo funkcije direktno ugrađuje u kôd koji se poziva.

• Semantika poziva ostaje potpuno ista kao i za običnu funkciju.

• Ovakva funkcija deklarire se kao inline:

31

Funkcije

• Funkcija članica klase može 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 ispoštovati zahtjev za neposredno ugrađivanje u kôd.

• Za korisnika ovo ne treba predstavljati nikakvu prepreku, jer je semantika ista.

• Inline funkcije samo mogu da ubrzati program, a nikako izmijeniti njegovo izvršavanje.

• Ako se inline funkcija koristi u više datoteka, u svakoj se datoteci mora nalaziti njena potpuna definicija (najbolje pomoću datoteke-zaglavlja).

• C++ osigurava i mogućnost postavljanja podrazumijevanih vrijednosti za argumente.

• Ako se kod poziva funkcije ne navede argument za koji je definirana podrazumijevana vrijednost (u deklaraciji funkcije), kao vrijednoststvarnog argumenta uzima se ta podrazumijevana vrijednost.

33

Funkcije

34

• Često se javlja potreba da se u programu naprave funkcije koje realiziraju logički istu operaciju, samo sa različitim 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 različita imena što bi smanjilo čitljivost programa.

• U jeziku C++ moguće je definirati više različitih funkcija sa istim identifikatorom.

• Ovakav koncept naziva se preklapanje imena funkcija (engl. functionoverloading).

• Uvjet je da im se razlikuje broj i/ili tipovi argumenata.

• Tipovi rezultata se ne moraju razlikovati.

Funkcije

35

• Koja će se funkcija stvarno pozvati, određuje se u fazi prevođenja prema slaganju tipova stvarnih i formalnih argumenata.

• Zato je potrebno da prevoditelj može jednoznačno odrediti koja funkcija se poziva.

• Pravila za razrješavanje poziva su vrlo složena, pa se u praksi svode samo na dovoljno razlikovanje tipova formalnih argumenata preklopljenih funkcija.

• Kada razrješava poziv, prevoditelj otprilike ovako prioritiziraslaganje tipova stvarnih i formalnih argumenata:

najbolje odgovara potpuno slaganje tipova; tipovi T* (pokazivač na T) i T[] (niz elemenata tipa T) se ne razlikuju;

sljedeće po odgovaranju je slaganje tipova korištenjem standardnih konverzija;

sljedeće po odgovaranju je slaganje tipova korištenjem korisničkih konverzija;

najlošije odgovara slaganje sa tri toče (...).

Konverzija tipova podataka

• C++ je strogo tipizirani jezik, što je u duhu njegove objektne orijentacije.

• Tipizacija znači da svaki objekt ima svoj točno određeni tip.

• Svaki put kada se na nekom mjestu očekuje objekt jednog tipa, a koristi se objekt drugog tipa, potrebno je izvršiti konverziju.

• Konverzija tipa znači pretvaranje objekta inicijalnog tipa u objekt potrebnog tipa.

36

Konverzija tipova podataka

• Slučajevi kada je potrebno izvršiti konverziju: (1) Operatori za ugrađene tipove zahtijevaju operande

odgovarajućeg tipa;

(2) Neke kontrolne strukture (if, for, do, while, switch) zahtijevaju izraze odgovarajućeg tipa;

(3) Kod poziva funkcije, kada su stvarni argumenti drugačijeg tipa od deklariranih formalnih argumenata te kad su operatori za korisničke tipove (klase) specijalne vrste funkcija.

(4) Kod povratka iz funkcije, ako se u izrazu iza return koristi izraz drugačijeg tipa od deklariranog tipa povratne vrijednosti funkcije;

(5) Kod inicijalizacije objekta jednog tipa pomoću objekta drugog tipa; slučaj pod (3) se može uvrstiti u ovu grupu jer se formalni argumenti inicijaliziraju stvarnim argumentima pri pozivu funkcije. Također, slučaj pod (4) se može uvrstiti u ovu grupu, jer se privremeni objekt, koji prihvaća vraćenu vrijednost funkcije na mjestu poziva, inicijalizira izrazom iza naredbe return.

37

Konverzija tipova podataka

• Konverzija tipa može biti ugrađena u jezik (standardna konverzija) ili istu definira korisnik (programer) za svoje tipove (korisnička konverzija).

• Standardne konverzije su, primjerice, konverzije iz tipa int u tip float, ili iz tipa char u tip int, itd.

• Prevoditelj može sam izvršiti konverziju koja mu je dozvoljena, na mjestu gdje je to potrebno – takva sekonverzija naziva implicitnom.

• Programer može eksplicitno navesti koju je konverziju potrebno izvršiti - ova konverzija naziva se eksplicitnom.

• Primjer eksplicitne konverzije je pomoću operatora cast: (tip)izraz

38

Struktura programa

• Program se sastoji samo od deklaracija (klasa, objekata, ostalih tipova i funkcija).

• Sva obrada vrši se unutar tijela funkcija.

• Program se fizički dijeli na odvojene jedinice prevođenja -datoteke.

• Datoteke se prevode odvojeno i nezavisno, a zatim se povezuju u izvršni program.

• Prije korištenja, u svakoj se datoteci moraju deklarirati svi objekti.

• Zavisnosti između datoteka definiraju se pomoću datoteka-zaglavlja.

• Zaglavlja sadrže deklaracije svih entiteta koji se koriste u pojedinoj datoteci, a definirani su u nekom drugoj datoteci.

• Zaglavlja (.h) se uključuju u tekst datoteke koja se prevodi (.cpp) pomoću naredbe #include.

• Glavni program (izvor kontrole toka) definira se kao obavezna funkcija main. 39

Struktura programa

40

Struktura programa

41

Doseg identifikatora

• Doseg identifikatora je onaj dio programa u kome se deklarirani identifikator može 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, uključujući i blok tijela funkcije.

• Njihov doseg je od mjesta gdje su deklarirani, do završetka bloka u kome su deklarirani.

42

Doseg identifikatora

• Globalnom identifikatoru se može pristupiti, iako je sakriveno, navođenjem operatora "::" ispred identifikatora:

• Za formalne argumente funkcije smatra se da su lokalni, deklarirani u vanjskom bloku tijela funkcije:

• Prvi izraz u naredbi for može 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, može 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 područje u memoriji podataka za vrijeme izvršavanja programa.

• Navedeno može biti varijabla (globalna ili lokalna), privremeni objekt koji se kreira pri izračunavanja izraza, ili jednostavno memorijska lokacija na koju pokazuje neki pokazivač.

• Objekt je primjerak nekog tipa (ugrađenog ili klase), ali ne i funkcija.

• U jeziku C++ varijabla je nekonstantni objekt.

• Lvrijednost (nešto što stoji sa lijeve strane operatora pridruživanja) je izraz koji upućuje na objekt.

• Međutim, 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 vraća lvrijednost kao rezultat.

• "Početna" lvrijednost je ime objekta ili funkcije. Na taj se način rekurzivno definiraju lvrijednosti.

• Promjenljiva lvrijednost je ona lvrijednost, koja nije ime funkcije, ime niza, ili konstantni objekt.

• Samo ovakva lvrijednost može biti lijevi operand operatora dodjele.45

Objekti i lvrijednosti

46

Životni vijek objekta

• Životni vijek objekta je vrijeme u tijeku izvršavanja programa za koje taj objekt postoji (u memoriji) te tijekom kojeg mu se može pristupati.

• Na početku ž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 napuštanja područja valjanosti tog objekta. Automatski objekt se kreira iznova pri svakom pozivu bloka u kome je deklariran. Definicija objekta je izvršna naredba.

• Životni vijek statičkih objekata (globalni i lokalni static objekti) traje od izvršavanja njihove definicije do kraja izvršavanja programa. Globalni statički objekti se kreiraju samo jednom, na početku izvršavanja programa, prije korištenja bilo koje funkcije ili objekta iz iste datoteke, ne obavezno prije poziva funkcije main, a prestaju egzistirati po završetku funkcije main. Lokalni statički objekti počinju egzistirati pri prvom nailasku toka programa na njihovu definiciju.

• Životni vijek dinamičkih 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 izračunavanju izraza, za pohranu međurezultata ili privremenu pohranu povratne vrijednosti funkcije. Najčešće se uništavaju kada više 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 prevođenja, a ne izvršavanja.

• Konstanta se mora inicijalizira za vrijeme definiranja.

• Prevoditelj često ne odvaja memorijski prostor za konstantu, već njeno korištenje rješava tijekom prevođenja.

• Konstante se mogu koristiti u izrazima koje prevoditelj treba izračunati za vrijeme prevođenja, npr. dimenzije polja.

• Pokazivač na konstantu definira se stavljanjem riječi const ispred cijele definicije.

• Konstantni pokazivač definira se stavljanjem riječi const ispred samog imena.

52

Konstante

• Navođenjem riječi const ispred deklaracije formalnog argumenta funkcije koji je pokazivač, osigurava se da funkcija ne može mijenjati objekt na koji taj argument pokazuje.

• Navođenjem riječi const ispred tipa koji vraća funkcija, definira se da će privremeni objekt koji se kreira od vraćene vrijednosti funkcije biti konstantan i njegovu upotrebu kontrolira prevoditelj.

• Za povratnu vrijednost koja je pokazivač na konstantu, ne može se preko vraćenog pokazivača mijenjati objekt.

• Preporuka je da se umjesto tekstualnih konstanti koje se ostvaruju pretprocesorom (kao u jeziku C) koriste konstante na opisani način.

• Dosljedno korištenje konstanti u programu osigurava korektnost konstantnosti (predstavlja podršku prevoditelja u sprečavanju nastanka grešaka).

53

Konstante

54

Dinamički objekti

• Operator new kreira jedan dinamički objekt, a operator delete ukida dinamički 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 određenog tipa, a zatim poziva konstruktor tipa sa zadanimvrijednostima.

• Operator new vraća pokazivač na dani tip:

55

Dinamički objekti

• Objekt kreiran pomoću operatora new naziva se dinamički objekt, jer mu je životni vijek poznat tek u vrijeme izvršavanja.

• Ovakav objekat nastaje kada se izvrši operator new, a traje sve dok se ne oslobodi operatorom delete (može egzistirati i po završetku bloka u kome je kreiran):

56

Dinamički objekti

• Operator delete ima jedan argument koji je pokazivač na neki tip.

• Ovaj pokazivač mora pokazivati na objekt kreiran pomoću operatora new.

• Operator delete poziva destruktor za objekt na koji pokazuje pokazivač, a zatim oslobađa zauzeti prostor.

• Ovaj operator vraća void.

• Operatorom new može se kreirati i niz objekata nekog tipa.

• Ovakav niz ukida se operatorom delete sa parom uglatih zagrada.

57

Dinamički objekti

• Kada se alocira polje, nije moguće zadati inicijalizatore.

• Ako klasa nema definiran konstruktor, prevoditeljosigurava podrazumijevanu inicijalizaciju.

• Ako klasa ima konstruktore, da bi se alociralo polje potrebno je da postoji konstruktor koji se može pozvati bez argumenata.

• Kada se alocira polje, operator new vraća pokazivač na prvi element alociranog polja.

• Sve dimenzije polja osim prve trebaju biti konstantni izrazi, a prva dimenzija može da bude i varijabilni izraz na način da se može izračunati u trenutku izvršavanja naredbe sa operatorom new.

58

Reference

• U jeziku C prijenos argumenata u funkciju bio je isključivo 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 isključivo 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 (uključujući 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 obraćanje referenci podrazumijeva posredni pristup objektu preko ovog pokazivača.

• Nema načina da se, nakon inicijalizacije, vrijednost ovog pokazivača promijeni.

• Referenca je slična pokazivaču, ali se posredan pristup preko pokazivača na objekt vrši operatorom *, a preko reference bez oznaka.

• Dohvaćanje adrese (operator &) reference znači dohvaćanje adrese objekta na koji ona pokazuje.

62

Reference

• Ako je referenca tipa reference na konstantu, onda to znači da se referencirani objekt ne smije promijeniti posredstvom te reference.

• Referenca se može 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 vraća, a zatim se koristi u izrazu iz koga je funkcija pozvana.

• Rezultat poziva funkcije je lvrijednost samo ako funkcija vraća referencu.

• Ne postoje polja referenci, pokazivači na reference, ni reference na reference.

63

Reference

64

Slogovi

65

• Slog je mehanizam agregacije u kojem se povezuje više podataka koji mogu imati međusobno različite 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 vitičaste zagrade navode se identifikatori (imena) varijabli koje će kao tip podataka imati složeni tip definiran strukturom.

• Ime strukture koristi se kao ime tipa podataka kojim će se kasnije u programu moći deklarirati varijable.

Slogovi

66

Unije

67

• U programskom jeziku C++ postoji mehanizam agregacije koji omogućuje 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 ključnoj riječi union koja se koristi umjesto ključne riječi struct.

top related