69
SUVREMENE TEHNIKE PROGRAMIRANJA IMPLEMENTACIJA TEMELJNIH KONCEPATA OOP U PROGRAMSKOM JEZIKU C++ DRUGO PREDAVANJE

2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Embed Size (px)

DESCRIPTION

stp

Citation preview

Page 1: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

SUVREMENE TEHNIKE PROGRAMIRANJA

IMPLEMENTACIJA TEMELJNIH KONCEPATA OOP U PROGRAMSKOM JEZIKU C++

DRUGO PREDAVANJE

Page 2: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 3: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 4: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Ugrađeni tipovi i deklaracije

4

Page 5: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 6: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 7: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Izrazi

7

Page 8: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 9: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 10: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Selekcija tipa IF

10

Page 11: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Selekcija tipa ?

uvjet ? izraz1 : izraz2 ;

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

11

Page 12: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Selekcija tipa SWITCH

switch (cjelobrojni izraz) {

case slucaj 1: blok naredbi

.

.

.

case slucaj n: blok naredbi

default: blok naredbi

}

12

Page 13: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Selekcija tipa SWITCH

13

Page 14: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 15: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Iteracija tipa FOR

for (inicijalna vrijednost; uvjet zavrsetka; promjena)

blok naredbi

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

15

Page 16: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Iteracija tipa WHILE

while (logicki uvjet)

blok naredbi

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

16

Page 17: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Iteracija tipa DO-WHILE

do

blok naredbi

while (logicki uvjet);

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

17

Page 18: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Naredbe preskoka

18

Page 19: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 20: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 21: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 22: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 23: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 24: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Veza između polja i pokazivača

24

Page 25: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 26: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 27: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 28: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Funkcije

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

28

Page 29: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 30: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Funkcije

30

Page 31: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 32: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 33: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 34: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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.

Page 35: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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 (...).

Page 36: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 37: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 38: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 39: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 40: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Struktura programa

40

Page 41: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Struktura programa

41

Page 42: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 43: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 44: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 45: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 46: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Objekti i lvrijednosti

46

Page 47: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Ž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

Page 48: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Ž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

Page 49: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Ž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

Page 50: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Životni vijek objekta

50

Page 51: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Životni vijek objekta

51

Page 52: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 53: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 54: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Konstante

54

Page 55: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 56: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 57: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 58: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 59: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 60: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 61: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 62: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 63: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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

Page 64: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Reference

64

Page 65: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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.

Page 66: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

Slogovi

66

Page 67: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C

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.

Page 68: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C
Page 69: 2 - Implementacija Temeljnih Koncepata Objektno Orijentiranog Programiranja u Jeziku C