You are on page 1of 52

Objektno orijentisano

programiranje
Klase

Strukturalno i oo programiranje
Dosad smo prouavali strukturalne programe,
tj. programe koji ne koriste nijednu
objektno-orijentisanu karakteristiku jezika C++
Da bi se pisali objektno-orijentisani programi,
moraju se koristiti klase i objekti
Objektno-orijentisana aplikacija sastoji se od skupa
objekata koji meusobno komuniciraju slanjem
poruka i odgovaranjem na njih
Objektno-orijentisano programiranje zasniva se na
principu definisanja sopstvenih tipova podataka
Objektno orijentisano programiranje

Zato je nastalo oo programiranje?


OO programiranje je pristup realizaciji softvera kao
modela realnog sveta
Nastalo je kao odgovor na softversku krizu koja se
ogleda u tome to se softver projektuje due nego
to je predvieno, kota vie nego to je predvieno
i ne zadovoljava sve postavljene sloene zahteve
OO su smislili programeri kao nain da sebi olakaju
ivot
Najvanije je projektovanje, a sama realizacija se
odlae za kasnije
Objektno orijentisano programiranje

ta je klasa?
Klasa je korisniki definisan tip podataka kojim se
modeliraju objekti slinih svojstava
Uoavanje zajednikih osobina (svojstava) objekata
i njihovo grupisanje u klasu naziva se apstrakcija
Klasa je opisana svojim:
o
o

atributima (podacima lanovima)


operacijama (funkcijama lanicama, metodama)

Atributi najee predstavljaju unutranjost klase, tj.


njenu realizaciju, a metode njen interfejs, odnosno
ono to se moe raditi sa njom
Objektno orijentisano programiranje

Klase
Klasa se deklarie kljunom rei class
class ime_klase { lista_clanova };

Unutar deklaracije klase po pravilu se navode samo


prototipovi (deklaracije) funkcija (metoda)

Objektno orijentisano programiranje

ta je objekat?
Objekat je primerak (instanca) klase
Poto je klasa tip, objekti se mogu smatrati
promenljivama tog tipa u programu
Objekti klase se deklariu navoenjem imena klase
iza koga slede nazivi objekata razdvojeni zarezima
lanovima klase pristupa se pomou znaka .

Objektno orijentisano programiranje

Objekat
Svaki objekat klase ima sopstveni skup vrednosti
lanova svoje klase

Objektno orijentisano programiranje

Osobine oo jezika
Sakrivanje podataka (encapsulation)
Nasleivanje (inheritance)
Polimorfizam (polymorphism)

Objektno orijentisano programiranje

Kapsuliranje
Sakrivanje detalja realizacije klase
Korinicima klase potrebno je samo precizno
definisati ta se sa objektima klase moe raditi,
a nain kako se to radi sakriva se od korisnika
Nema naina da neki objekat zaviri u unutranjost
drugog osim ako mu to ovaj nije eksplicitno dozvolio
Kontrola pristupa podacima lanovima i funkcijama
lanicama klase zadaje se modifikatorima public,
protected i private
Objektno orijentisano programiranje

Nasleivanje
Klasa se moe definisati tako da nasledi sve osobine
neke postojee klase, ali da ima i jo neke dodatne,
svoje osobine
Tako dobijena klasa zove se izvedena (derived class)
iz osnovne klase (base class)
Izvedena klasa je jedna vrsta (a kind of) druge klase
class Izvedena_klasa : public Osnovna_klasa {lista clanova};

Objektno orijentisano programiranje

10

Nasleivanje
Nasleivanjem se uvodi hijerarhija u sistem klasa
Izvedena klasa nasleuje sve osobine osnovne
klase, a definie samo one nove, koje je ine
jedinstvenom
Mehanizam nasleivanja omoguuje objektu da
bude specifini primerak nekog uoptenijeg sluaja

Objektno orijentisano programiranje

11

Polimorfizam
Najee se definie izrekom jedan interfejs, vie
metoda
Svojstvo da svaki objekat izvedene klase, ak i kada
mu se pristupa kao objektu osnovne klase, izvrava
metod tano onako kako je to definisano u njegovoj
izvedenoj klasi, naziva se polimorfizam
Koncept polimorfizma pomae u ponovnoj upotrebi
gotovog koda (code reuse)

Objektno orijentisano programiranje

12

Kontrola pristupa lanovima klase


lanovi (podaci ili metode) klase koji se nalaze
ispred kljune rei public: zatieni su od pristupa
spolja (oni su sakriveni, kapsulirani)
Nazivaju se privatni lanovi, i njima mogu pristupati
samo funkcije lanice iste klase
Da bi se deo klase uinio javnim, tj. da bi bio vidljiv u
kodu izvan klase, navodi se kljuna re public:
lanovi iza kljune rei public: dostupni su izvan
klase i nazivaju se javnim lanovima
Objektno orijentisano programiranje

13

Funkcije lanice (metode) klase


Zatienim (private) lanovima klase obino se
pristupa preko javnih (public) funkcija lanica
Kada funkcija lanica koristi privatan podatak lan
svoje klase, pristupa mu direktno, bez korienja
operatora .
Funkcija lanica se uvek poziva za neki objekat
svoje klase

Objektno orijentisano programiranje

14

Konstruktori klasa
Specijalna funkcija lanica koja se automatski
poziva na poetku ivotnog veka objekta zove se
konstruktor
Konstruktor slui za inicijalizovanje objekta
Konstruktor je funkcija lanica koja ima isto ime kao
klasa, a nema povratni tip
Konstruktor moe, ali ne mora imati argumente
Konstruktor se moe preklopiti, tj. za istu klasu moe
se definisati vie konstruktora koji se razlikuju po
tipu ili broju argumenata
Objektno orijentisano programiranje

15

Podrazumevani (default) konstruktor


Ako nijedan konstruktor nije eksplicitno deklarisan u
definiciji klase, C++ kompajler e sam generisati tzv.
default (podrazumevani) konstruktor
Podrazumevani konstruktor je javan (public)
Default konstruktor samo kreira objekat klase,
ali ne inicijalizuje njegove podatke lanove
Ako se za klasu deklarie neki konstruktor sa
argumentima, tada default konstruktor vie nee biti
dostupan, pa svaki deklarisan objekat klase mora da
bude i inicijalizovan
Objektno orijentisano programiranje

16

Operator dosega (scope)


Operator :: povezuje ime klase sa njenim lanom da
bi kompajleru saoptio sa kojom klasom je povezan
taj lan
Poto vie razliitih klasa mogu da imaju funkcije
lanice istog imena, operator :: je neophodan
Operator dosega mora biti korien u definiciji
konstruktora zato to se ona nalazi izvan deklaracije
klase

Objektno orijentisano programiranje

17

Operator dosega (scope)

Objektno orijentisano programiranje

18

Dodeljivanje default vrednosti


lanovima u konstruktoru
Funkcijama
lanicama klase,
pa i konstruktoru,
mogu se dodeliti
default vrednosti
argumenata
Default vrednosti
se navode u
deklaraciji
konstruktora
unutar klase
Objektno orijentisano programiranje

19

Konstruktori izvedenih klasa


Pri kreiranju objekta izvedene klase prvo se izvrava
konstruktor osnovne klase, a zatim konstruktor
izvedene klase
Konstruktor osnovne klase inicijalizuje podobjekat
osnovne klase unutar objekta izvedene klase
Konstruktor izvedene klase inicijalizuje samo
dodatne lanove izvedene klase

Objektno orijentisano programiranje

20

Konstruktori izvedenih klasa

Objektno orijentisano programiranje

21

Destruktori klase
Funkcija lanica koja se automatski poziva kada
objekat prestaje da ivi zove se destruktor
Ime destruktora je isto kao ime klase, sa prefiksom
~ (tilde)
Default destruktor nema povratni tip, nema
argumente, ne moe biti preklopljen i javan je
(public)
Moemo da napravimo i sopstvenu verziju
destruktora
Objektno orijentisano programiranje

22

Destruktori

Objektno orijentisano programiranje

23

Inline funkcije
U definicijama klase esto se koriste ugraene
(inline) funkcije, mada one nisu oo karakteristika
jezika
Inline funkcije od prevodioca zahtevaju da kod tela
funkcije ugradi neposredno u kod programa na
mestima poziva te funkcije, umesto uobiajenog
postupka poziva funkcije
Inline je zapravo zahtev za optimizaciju koda koji
moe ali ne mora biti ispunjen

Objektno orijentisano programiranje

24

Inline funkcije
Funkcije lanice su podrazumevano inline ako se
njihova definicija navodi unutar deklaracije klase
Moe se deklarisati kao inline i van deklaracije klase
Mehanizam inline treba paljivo primenjivati,
samo za vrlo jednostavne funkcije

Objektno orijentisano programiranje

25

Pokaziva this
Svaka funkcija lanica koja se izvrava sadri
skriveni pokaziva na objekat koji ju je pozvao
Taj pokaziva zove se this
Kada u funkciji lanici koristimo direktno neki
podatak lan pristupom preko imena, kompajler
automatski razume da koristimo (*this).ime_lana,
to se krae pie kao this->ime_lana

Objektno orijentisano programiranje

26

Understand this
Ukoliko je potrebno, pokaziva this se moe i
direktno pozvati u funkciji lanici, npr. ako ona vraa
pokaziva na tekui objekat

Objektno orijentisano programiranje

27

Objektno orijentisano programiranje

28

Nizovi objekata
Objekti se
mogu smetati
u niz isto kao
prosti tipovi, i
pristupa im se
uobiajenom
sintaksom
indeksiranja

Objektno orijentisano programiranje

29

Inicijalizovanje nizova objekata


Ako klasa ima
konstruktor sa
argumentima,
niz objekata se
moe
inicijalizovati

Objektno orijentisano programiranje

30

Pokazivai na objekte
Ako se koriste pokazivai na objekte, za pristup
pojedinanim lanovima koristi se operator ->
p -> funkcija() je ekvivalentno sa (*p).funkcija().
Zagrade oko *p su neophodne zato to operator .
ima vei prioritet od operatora dereferenciranja *
Adresa objekta se dobija primenom operatora &,
kao da se radi o obinoj promenljivoj prostog tipa
I reference na objekte se deklariu na isti nain kao
reference na obine promenljive

Objektno orijentisano programiranje

31

Pokazivai na objekte

Objektno orijentisano programiranje

32

Zajedniki lanovi klasa


Pri kreiranju objekata klase, za svaki objekat se
kreira poseban komplet podataka lanova
Mogue je definisati podatke lanove za koje postoji
samo jedan primerak za celu klasu, tj. za sve
objekte klase
Ovakvi lanovi nazivaju se statikim lanovima, i
deklariu se pomou rei static

Objektno orijentisano programiranje

33

Zajedniki lanovi klasa


Statiki lan klase ima ivotni vek kao i globalna
promenljiva: nastaje na poetku programa
i traje do kraja programa
Statiki lan klase ima sva svojstva globalnog
objekta, osim oblasti vaenja klase i kontrole
pristupa
Statiki lan mora da se inicijalizuje posebnom
deklaracijom van deklaracije klase

Objektno orijentisano programiranje

34

Zajedniki lanovi klasa


Statikom lanu moe da se pristupi iz funkcije
lanice, ali i van funkcija lanica, ak i pre formiranja
ijednog objekta klase (jer statiki lan nastaje kao i
globalni objekat), naravno uz potovanje prava
pristupa.
Pristupa mu se preko operatora :: (X::i)
Smanjuju potrebu za globalnim objektima i tako
poveavaju itljivost programa, jer je, za razliku od
globalnih objekata, mogue ograniiti pristup do njih
Zajedniki lanovi logiki pripadaju klasi i
"upakovani" su u nju
Objektno orijentisano programiranje

35

Zajednike funkcije lanice


I funkcije lanice mogu da se deklariu kao
zajednike za celu klasu, dodavanjem rei static
ispred deklaracije funkcije lanice
Statike funkcije ne poseduju pokaziva this
i ne mogu neposredno (bez pominjanja konkretnog
objekta klase) koristiti nestatike lanove klase
Statike funkcije mogu neposredno koristiti samo
statike lanove te klase

Objektno orijentisano programiranje

36

Zajednike funkcije lanice


Statike funkcije lanice mogu se pozivati za
konkretan objekat (to nema posebno znaenje),
ali i pre formiranja ijednog objekta klase, preko
operatora ::
Statike funkcije predstavljaju operacije klase,
a ne svakog posebnog objekta
Pomou njih se definiu neke opte usluge klase
(class utilities)

Objektno orijentisano programiranje

37

Dinamika alokacija memorije


Kad god je memorija potrebna programu, mogue je
u jeziku C++ alocirati memoriju za promenljive,
nizove, objekte itd. iz specijalne zone memorije koja
se zove hrpa (heap)
Heap memorija je kompletno pod kontrolom
korisnika, tj. korisnik moe da alocira i dealocira
memoriju kad god je to potrebno
Proces alokacije i dealokacije memorije kada se
program izvrava zove se dinamika alokacija
memorije
Objektno orijentisano programiranje

38

Memorija u programu
Heap memorija se razlikuje od drugih zona
memorije koje program koristi, kao to su memorija
za statike i automatske promenljive
Automatske promenljive deklarisane unutar bloka,
kreiraju se u steku kada program ulazi u blok i
dealociraju kada program naputa blok
Programer nema kontrolu nad alokacijom i
dealokacijom automatskih i statikih promenljivih,
ve se ona obavlja automatski

Objektno orijentisano programiranje

39

Operator new
Operator new pravi dinamiki objekat,
tj. alocira memoriju za njega
Operator new za operand ima identifikator tipa i
eventualne inicijalizatore (argumente konstruktora)
Operator new vraa pokaziva na dati tip
Ako nema dovoljno slobodne heap memorije da bi
se zadovoljio alokacioni zahtev, new vraa null
pokaziva

Objektno orijentisano programiranje

40

Operator delete
Objekat kreiran pomou operatora new naziva se
dinamiki objekat, jer mu je ivotni vek poznat tek u
vreme izvravanja programa.
Ovakav objekat nastaje kada se izvri operator new,
a traje sve dok se ne ukine operatorom delete
(moe da traje i po zavretku bloka u kome je
nastao)

Objektno orijentisano programiranje

41

Operator delete
Operator delete ima jedan operand koji je pokaziva
na neki tip. Ovaj pokaziva mora da ukazuje na
objekat nastao pomou operatora new
Operator delete poziva destruktor za objekat na koji
ukazuje pokaziva, a zatim oslobaa zauzeti prostor
Operator delete vraa void

Objektno orijentisano programiranje

42

Dodela jednog objekta drugom


Mogue je dodeliti jedan objekat drugom objektu
ako pripadaju istoj klasi
U tom sluaju dodela se obavlja direktnim
kopiranjem sadraj po principu lan po lan
Nakon dodele, postojae dva posebna objekta iji
e sadraj biti identian, pa naknadne izmene
lanova jednog objekta nee imati uticaja na drugi

Objektno orijentisano programiranje

43

Objekat kao povratni tip funkcije


Kada funkcija vraa objekat, pravi se privremeni
objekat koji sadri povratnu vrednost
im se vrednost vrati, objekat se unitava pozivom
destruktora

Objektno orijentisano programiranje

44

Prosleivanje objekata funkciji


Objekti se u funkcije prenose standardno po
vrednosti, tj. pravi se njihova kopija (novi objekat)
koji postaje parametar
Kada se pravi kopija objekta tokom poziva funkcije,
ne poziva se standardni konstruktor, ve tzv.
konstruktor kopije
Ako klasa nema konstruktor kopije, poziva se default
verzija koja kopira objekat bit po bit

Objektno orijentisano programiranje

45

Konstruktor kopije
Prilikom kopiranja objekta ne poziva se obian, ve
konstruktor kopije (copy constructor) zato to obian
konstruktor inicijalizuje objekat
Kada kopiramo objekat, mi ne elimo da ga
inicijalizujemo konstruktorom, ne treba nam njegovo
poetno, ve trenutno stanje
Kada se funkcija zavri, lokalna kopija objekta se
unitava pozivom (standardnog) destruktora klase

Objektno orijentisano programiranje

46

Prosleivanje objekata funkciji


Problemi:
Ako objekat koristi neki resurs (npr. datoteku,
memoriju), ako se u funkciju prenosi po vrednosti,
prilikom unitavanja kopije objekta unitie se i
resurs, pa e originalni objekat biti oteen
o Ako objekat sadri lan koji je pokaziva,
i kopija koju je napravio konstruktor kopije
(bit po bit) pokazivae na isti objekat
o

Objektno orijentisano programiranje

47

ta da se radi?
Reenje br.1:
o
o

Prenositi objekte po referenci (adresi)


Ali ovo nije uvek mogue

Reenje br. 2
Redefinisati konstruktor kopije tako da radi
ono to elimo
o

Objektno orijentisano programiranje

48

Prosleivanje objekata po adresi


U ovom
sluaju
funkcija radi
direktno sa
objektom,
pa promene
parametra
utiu na
argument

Objektno orijentisano programiranje

49

Konstruktor kopije
Konstruktor kopije (copy constructor) je specijalan,
preklopljen konstruktor klase koji se poziva uvek
kada se pravi kopija objekta
Deklarie se sa jednim argumentom tipa
ime_klase&
ime_klase (ime_klase&)

U jeziku C++ razlikujemo dva sluaja kada se


vrednost jednog objekta dodeljuje drugom:
o
o

dodela (objekat kome se dodeljuje ve postoji)


inicijalizacija
Objektno orijentisano programiranje

50

Konstruktor kopije
Inicijalizacija se deava u tri sluaja:
o
o

Kada jedan objekat eksplicitno inicijalizuje drugi


Kada se pravi privremeni objekat

Kada se pravi kopija objekta koja se prosleuje


funkciji
o

Konstruktor kopije se primenjuje samo prilikom


inicijalizacija
Konstruktor kopije se ne poziva prilikom dodela

Objektno orijentisano programiranje

51

Konstruktor kopije

Argument konstruktora kopije ne moe da bude sam


objekat, ve uvek referenca na objekat; u suprotnom
bi se pojavila rekurzija jer bi se konstruktor kopije
pozivao unedogled
Objektno orijentisano programiranje

52

You might also like