ASP Objektno orijentirano programiranje
-
Upload
markoosijek -
Category
Documents
-
view
227 -
download
0
Transcript of ASP Objektno orijentirano programiranje
-
8/16/2019 ASP Objektno orijentirano programiranje
1/46
Uvod u objektno-orijentiranoprogramiranje u programskom
8.4.2007 autor: dr. sc. Zvonimir Vanjak
-
8/16/2019 ASP Objektno orijentirano programiranje
2/46
Evolucija programskih jezika
prva generacija – strojni jezik
–
treća generacija – Pascal, C, Fortran, Algol, LISP, ... uvodi se paradigma proceduralnog, strukturnog i modularnog programiranja
pojavljuju se i višenamjenski jezici
objektno-orijentirani jezici kao nova paradigma razvoja (- Smalltalk, C++, Java, C#
četvrta generacija – 4GL jezici
jezici specijalizirani za određenu domenu problema
Algoritmi i strukture podataka, 2006/07. 8.4.2007 2 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
3/46
Razvoj tipičnog programera
uglavnom započinje učenjem nekog programskog jezika treće
Basic, Pascal, C ,
koristi se paradigma nestrukturiranog programiranja
započinje se pisanjem malih i jednostavnih programa koji se sastoje odslijeda naredbi i djeluju nad zajedničkim skupom podataka
Algoritmi i strukture podataka, 2006/07. 8.4.2007 3 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
4/46
Proceduralna paradigma - I
osnovni korak je uvođenje funkcija koje su izgrađene kao skup naredbi i koje imaju dobrodefiniran ulaz i izlaz (već viđeno na PIPI-ju)
rješavamo se problema ponavljanja programskog kôda!!!
definiramo ga na jednom mjestu i zatim samo pozivamo funkciju kad nam zatreba takvafunkcionalnost
Glavni program
Podaci
Procedura 1 Procedura 2 Procedura 3
Lokalni podaci Lokalni podaci Lokalni podaci
Algoritmi i strukture podataka, 2006/07. 8.4.2007 4 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
5/46
Proceduralna paradigma - II
primjeri: – , funkcije za U/I – printf, fwrite funkci e za rad s rafikom - DrawLine DrawCircle
a što ako je netko već implementirao takve funkcije?! možemo ih ednostavno iskoristiti!
- većina razvojnih okruženja dolazi s ugrađenom gomilom biblioteka takvih funkcija reusability – mogućnost ponovnog iskorištavanja programskog kôda
“write once, use everywhere”
ali, nije sve tako jednostavno javlja se problem organizacije velikog broja funkcija u smislene cjeline!
Algoritmi i strukture podataka, 2006/07. 8.4.2007 5 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
6/46
Modularno programiranje
procedure srodne funkcionalnosti grupiraju se u module koji mogu imati vlastiteodatke
Modul 1Program
Procedura 1
Modul 2Lokalni podaci
Procedura 2 Procedura 3
Podaci 1
Lokalni podaci Lokalni podaci
Algoritmi i strukture podataka, 2006/07. 8.4.2007 6 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
7/46
I dalje nije sve idealno!
teško je napraviti modul da bude dobro definirana i zatvorena jedinicafunkcionalnosti!
programski jezici imaju vrlo “tanku” (i često nejasnu) definiciju modula npr. u C-u modul može biti:
- .h datoteka s pripadajućom .cpp datotekom
- biblioteka funkcija koja se statički povezuje (linka) u naš program
-
koncept modula je najčešće implementacijski detalj programskog okruženja u kojem radimoi nije potpuno integriran u sam programski jezik
osnovni problem je što funkcije i podaci ugrađeni u modul nisu povezani u
konkretne programske entitete koji bi predstavljali razumljiv i jasan koncept zara n e or sn e mo u a standardni predstavlja gomilu struktura i funkcija a mi bismo željeli imati “nešto”
kao: File Binar File TextFile ...
Algoritmi i strukture podataka, 2006/07. 8.4.2007
7 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
8/46
Potreba za objektno-orijentiranom paradigmom
stvar nije tako kompletno crna jer ovisi i o “razini” funkcionalnostiu rađeno u modul: moduli “niske razine” (npr. U/I funkcije u C-u, funkcije za grafičko iscrtavanje
u Windowsima) se svakodnevno (i uspješno) iskorištavaju u projektimadiljem svijeta
- jasno definirani, s dobrom dokumentacijom i “izglačani” dugotrajnim korištenjem
MASM (Microsoft Assembler) ima i varijable, i mogućnost definiranja
zašto nam je onda uopće C zanimljiv?- jednostavnija sintaksa, i (ipak) moćniji skup osnovnih naredbi
traži se potpuno nova paradigma programiranja “od ovor”: ob ektno-ori entirana aradi ma
Algoritmi i strukture podataka, 2006/07. 8.4.2007 8 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
9/46
Malo povijesti
Simula (1967.) prvi programski jezik sa svojstvima objektno-orijentirane paradigme
nam en en zgra n sus ava za s mu ac u uveden pojam klase / razreda
Smalltalk 1972. prvi “pravi” (čisti) objektno-orijentiran programski jezik (“sve je objekt”) razvijen u laboratoriju Xerox PARC
-
C++ “hibridni” objektno-orijentirani jezik nastao iz C-a - ispočetka se zvao “C s razredima” (“C
” razvio ga je Bjarne Stroustrup (1983.) u Bell Labs
inicijalna ANSI standardizacija je dovršena (tek) 1998., a 2003. je izdana verzija trenutno se radi na razvoju novog standarda C++0x C++ je “predak” danas široko korištenih jezika - Java, C# i VB.NET
Algoritmi i strukture podataka, 2006/07. 8.4.2007 9 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
10/46
Kako ćemo “savladati” OOP?
krećemo od (jednostavnog) problema koji ćemo riješiti u C-u
koncepata OO paradigme vidjeti kako se oni mogu riješiti u C++
problem:
zadana je datoteka u kojoj se nalazi određeni (nepoznat) broj podataka(radi jednostavnosti, datoteka je slijedna formatirana i sadrži u svakom
treba napisati program koji će učitati podatke iz datoteke u memoriju (u –
omogućiti njihovu obradu- s obzirom da odaci mora u ostati u memori i nakon učitavan a ni e mo uće
Algoritmi i strukture podataka, 2006/07. 8.4.2007 jednostavno rješenje slijednog
č
itanja podataka (jedan po jedan) sve do kraja datoteke!10 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
11/46
Jednostavno rješenje u C-u
rješenje:
ih ukupno ima
ponovno prolazimo kroz datoteku i iznova učitavamo podatke (s time da ihsada s remamo u alocirano ol e
ne zadovoljava zadani uvjet!!!
problem
Algoritmi i strukture podataka, 2006/07. 8.4.2007 11 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
12/46
Bolje rješenje
možemo koristiti funkciju realloc .
potrebi povećavamo tijekom učitavanja
“ ” pokazivač na alociranu memoriju
dobro je “povezati” podatke – definiramo strukturu
struct DinamickoPolje
{int *Podaci;int BrojElem;
Algoritmi i strukture podataka, 2006/07. 8.4.2007 12 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
13/46
Još bolje rješenje
definiramo i određeni skup funkcija koje će raditi s tom strukturom -
- struct FILE (fopen, fscanf, fread , ...)
int Inicijaliziraj (struct DinamickoPolje *Polje,
int InicijalniBrojElem);void Izbrisi (struct DinamickoPolje *Polje);int PostaviNovuVelicinu struct DinamickoPol e *Pol e
int NoviBrojEl);
Algoritmi i strukture podataka, 2006/07. 8.4.2007
_ _ _ _
13 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
14/46
Što nije dobro?
tehnički nedostaci implementacije u C-u:
- problem je što je ova struktura samo vrlo jednostavan “omotač” (engl. wrapper ) oko
pokazivača („sakrili“ smo malloc i realloc od korisnika strukture, ali nismodefinirali nikakvo dodatno ponašanje)
pristup podacima ide preko izravnog korištenja pokazivača koji je dios ru ure
o e. o ac- nameće se primjenjivanje idioma get/set za dohvaćanje i postavljanje vrijednosti
elemenata u ol u
poboljšanja:
definiramo dodatne funkcije za rad sa strukturom
Algoritmi i strukture podataka, 2006/07. 8.4.2007 14 / 46
-
8/16/2019 ASP Objektno orijentirano programiranje
15/46
Primjer
struct DinamickoPolje{
int *Podaci;
int MaxBrojElemenata; // koliki je maksimalno raspolozivi prostor
};
int Inicijaliziraj (struct DinamickoPolje *Polje,int MaxBrojElem);
void Izbrisi (struct DinamickoPolje *Polje);
int PostaviNovuVelicinu (struct DinamickoPolje *Polje,int NoviBrojElem);
vo os av emen s ruc nam c o o e o e, n n ,int Vrijednost);
int DodajElementNaKraj (struct DinamickoPolje *Polje,int Vrijednost);
int DohvatiElement (struct DinamickoPolje *Polje, int Indeks);
int BrojElemenata (struct DinamickoPolje *Polje);
8.4.2007 15 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
16/46
Tehnički problem!
funkciju DohvatiElement() smo deklarirali kao
int DohvatiElement struct DinamickoPol e *Pol e int Indeks
a što ako se zatraži vrijednost elementa polja za nepostojeći indeks?
standardni način u C-u je signaliziranje pogreške preko povratnog argumentafunkcije novi prototip:
int DohvatiElement2 (struct DinamickoPolje *Polje, int Indeks,*
preko povratnog parametra (return) signaliziramo pogrešku (ako je bude) reko call b reference vraćamo dohvaćenu vri ednost
alternativa: pozvati exit() pa neka programer koji koristiDinamickoPolje popravi pogrešku u svom kodu
P02_DinamickoPolje_C_get_set8.4.2007 16 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
17/46
Ozbiljan nedostatak!
naše DinamickoPolje se može iskoristiti samo za podatketi a int! što ako imamo datoteku u kojoj su zapisani podaci tipa float?
kako oo ćiti našu im lementaci u strukture DinamickoPol eda se može iskoristiti za bilo koji tip podatka? klasično rješenje u C-u – korištenje typedef
bolje (i složenije) rješenje – koristimo void * kao tip podataka u polju- programer kod iskorištavanja dinamičkog polja mora koristiti cast operatore!
Naputak: u C++ se učinkovito i programski “čisto” rješava pomoću
predložaka (template) .NET i Java – pojam generics P03_DinamickoPolje_C_typedef
P03_DinamickoPolje_C_void 8.4.2007 17 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
18/46
Nedostaci sa stajališta dizajna programa
svakoj funkciji moramo prenositi pokazivač na strukturu “ ”
programeri u C-u (ali i Pascalu, Fortranu, Basicu) s takvom paradigmom“ ” -
pozivi funkcija iz biblioteke su isprepleteni s pozivima drugih funkcija
smanjuje se razumljivost programa
nema zravne na prv pog e v ve povezanos e ar ranestrukture i funkcija koje nad njom operiraju sve dobivaju pokazivač struct DinamickoPolje *, ali će
korisnici i sami definirati mnoge funkcije koje dobivaju takav pokazivač!
8.4.2007 18 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
19/46
Nedostaci – dio drugi
mogućnost sukoba imena (engl. name clash)
koristimo hrvatske nazive za varijable i funkcije pa i nije toliki problem! -
omogućiti široko/internacionalno korištenje razvijene biblioteke) je situacija značajnogora (funkcije: initialize, setSize, cleanup ili delete )
što ako netko izravno promijeni vrijednost podatka u strukturi? definirane funkcije se oslanjaju na činjenicu da samo one izravno operiraju
nad podacima u strukturi- situacija: korisnik izravno promijeni podatak BrojElem
- čak i ako u dokumentaciji eksplicitno piše da se to ne smije raditi, prije ili kasnije ćenetko to i napraviti (greškom, neznanjem, lijenošću – tako mu je “lakše”)
8.4.2007 19 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
20/46
Kako riješiti nedostatke? Jedan po jedan!
uvodimo pojam članske funkcije! -
odvojeni
,- funkcije koje smo definirali za rad sa strukturom DinamickoPolje su “intimno”
povezane s tom strukturom
-
pitanje je kako dodatno naznač
iti tu povezanost! sintaksno – deklaraciju funkcije stavljamo unutar deklaracije
strukture
time funkcija postaje “član” strukture terminološka promjena
element strukture vari abla deklarirana kao dio strukture osta e članska
varijabla strukture8.4.2007 20 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
21/46
Jednostavan primjer
struct StrukturaC { struct StrukturaCPP {
};
void Funkcija(StrukturaC *s){ void Funkcija() { };
*
{ StrukturaC objC;Funkcija (&objC);
StrukturaCPP objCPP;objCPP.Funkcija();
return 0;}
P04_PrimjerClanskeFunkcije8.4.2007 21 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
22/46
Što smo postigli?
riješili smo “problem” stalnog prenošenja pokazivača na strukturu kaoarametra “problem” je samo prividno riješen – sada se mora naznačiti za koju varijablu (instancu
strukture) se poziva funkcija riješili smo problem sukoba imena
možemo imati funkcije istog imena, sve dok su one elementi različitih struktura
poz v un c a o e su o s ru ure se s n a sno asno raz u u o poz va“običnih” funkcija
instanca_strukture.ime_funkcije(parametri)
funkci e ko e izravno d elu u nad odacima u strukturi ima u izravnu vezu skonceptom strukture jasno, jer su njen integralni dio
8.4.2007 22 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
23/46
A kamo je nestalo DinamickoPolje *?
odnosno, kako pozvana funkcija “zna” za koju je varijablu strukture pozvana? funkci i se im licitno renosi okazivač this
this je pokazivač koji pokazuje na varijablu strukture za koju je članska funkcijapozvana“ ” “ ”
Primjer:
int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem) {// implicitno korištenje thisBrojElem = 0;
// ili eksplicitno
this->_BrojElem = 0;...}
P04_DinamickoPolje_Cpp1_clanske_funkcije8.4.2007 23 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
24/46
Operator određivanja dosega (scope resolution)
pojavile su se neke dvotočke u prethodnom primjeru?
int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem)...
::
u C++: doseg (scope) = “mjera” vidljivosti identifikatora (varijable,
funkcije, klase) u programu u našem primjeru je bitan jer njime kod implementacije funkcijeInicijaliziraj (a i svake druge članske funkcije)
naznačavamo njenu pripadnost razredu DinamickoPolje!
8.4.2007 24 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
25/46
Što je ostalo?
i dalje imamo problem – moguće je izravno promijeniti sadržaj varijabli ustrukturi utječemo na kasnije ponašanje članskih funkcija (najčešće s nedefiniranim posljedicama!)
rješava se uvođ
enjem prava pristupa pr va e pu c dio će biti dostupan svima, a koji dio će biti dostupan samo članskim funkcijama strukture
sintaksa:
struct PrimjerStrukture {
int _JavnoDostupnaVarijabla;void JavnoDostupnaClanskaFunkcija(int Parametar);
rivate:int _PrivatnaVarijabla;float PrivatnaClanskaFunkcija();
};
8.4.2007 25 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
26/46
Pristup privatnim dijelovima strukture
što se misli pod “dostupan”?
pristupiti privatnim dijelovima strukture
var._PrivatnaVarijabla = 0;
-
privatnim dijelovima strukture se može pristupiti samo unutar
i članske funkcije mogu biti privatne!
P05 Prim erStrukturePravaPristu a postoji i protected pravo pristupa
_
8.4.2007 26 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
27/46
Konačno – razredi (klase)!
uvodimo ključnu riječ class -
koja je razlika? sa s anov a ++ prevo e a pr marno s n a sna – o s ru ure e svepodrazumijevano public dok je kod razreda sve podrazumijevano
konceptualna razlika:-
ostali dijelovi programa direktno operiraju
-
razred kao primarni koncept OO paradigme (prisutan u svim OO jezicima!) namijenjene mo e ran u pre s av an u oncepa a z po ru a pro ema o r e avamo(DinamickoPolje, Stog, HashFile, ...) koji imaju složeno ponašanjerealizirano preko skupa članskih funkcija
P05_DinamickoPolje_Cpp2_prava_pristupa8.4.2007 27 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
28/46
Malo teorije
dva osnovna elementa OO paradigme: apstrakcija i enkapsulacija
–problema koji rješavamo
razre nam c o o e e aps ra c a oncep a nam og po a sdobro definiranim karakteristikama
-- struktura predstavlja agregatni skup podataka nad kojima operiraju “vanjski” elementi
programa (funkcije)
- vanjske funkcije nisu dio strukture – zbog toga struktura nije “potpuna” jer je zarazumijevanje koncepta koji predstavlja potrebno proučiti nešto što nije dio same
- struktura nije “zatvorena” u smislu da ne upravlja sama svojim ponašanjem i stanjem!
8.4.2007 28 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
29/46
Enkapsulacija
niti jedan dio sustava ne bi smio ovisiti o unutrašnjim detaljima
korisnika razreda DinamickoPolje ne bi trebalo zanimati kako je
- napomena: koncept dinamičkog polja je vrlo jednostavan i praktički implicira načinimplementacije (dinamička alokacija memorije za elemente polja), ali kod složenijihrazreda to ni u kojem slu aju nije tako! čak i kod dinamičkog polja možemo imati varijabilnost u implementaciji
npr., ako je rukovanje memorijom “skriveno” od korisnika razreda, može se izgraditivlastiti memory-manager (ne koristimo malloc i realloc, već vlastitu
implementaciju – npr. radi efikasnosti)
ostižemo deklariran em unutrašn ih detal a razreda kao rivate budući da tada ionako ne može pristupiti tim dijelovima, korisnik razredaDinamickoPol e ne može o n ima ni ovisiti zato er ih ne može
izravno referencirati u programskom kodu koji on piše)8.4.2007 29 / 46Algoritmi i strukture podataka, 2006/07.
-
8/16/2019 ASP Objektno orijentirano programiranje
30/46
Javno sučelje razreda
sve što je u razredu deklarirano kao public dio je javnog sučelja “ ”
komunicira s ostalim dijelovima programa e n ran em ans var a ao pr va e, razre s r va svo e s an e
primjer enkapsulacije u stvarnom životu:
DVD player – javno suč
elječ
ini par kabela i daljinski upravljač
- “običnog” korisnika u biti ne zanima kako DVD player radi sve dok on ispravno reagira“ ” , , , ...
slično vrijedi i za razrede za or sn a razre a nam c o o e no e a razre ma
očekivano ponašanje, a kako je unutar razreda omogućeno takvo,
8.4.2007 30 / 46Algoritmi i strukture podataka, 2006/07.
P j bj kt
-
8/16/2019 ASP Objektno orijentirano programiranje
31/46
Pojam objekta
ovo je deklaracija razreda (novi tip podatka):
...
};
slično kao i kod struktura, razred predstavlja predložak iz kojega će se kreiratiob ekti!
kod struktura koristimo termin varijabla strukture ili instanca strukture kod razreda se konkretna instanca naziva objektom
razre e e an, a z n ega se mo e ns anc ra pro zvo an ro o e a a- svi će biti “isti” u smislu da svi imaju isti skup članskih varijabli i članskih funkcija-
objekti se razlikuju po vrijednostima koje imaju njihoveč
lanske varijable (te vrijednostipredstavljaju stanje objekta)- analogija sa strukturom polje – svi članovi su istog tipa, a vrijednosti im se razlikuju za svaki
indeks polja
8.4.2007 31 / 46Algoritmi i strukture podataka, 2006/07.
K i j bj k t
-
8/16/2019 ASP Objektno orijentirano programiranje
32/46
Kreiranje objekata
slično kao i kod struktura, kreiranje objekta primarno podrazumijeva
odnosno, treba alocirati prostor za članske varijable razreda
mogu a su va s an ar na na na: smještanje objekta na stog
- o e se e ar ra ao o a n o e unu ar un c e
smještanje objekta na gomilu (heap)“ ”- eksplicitno mora “uništiti” (izbrisati iz memorije)
, new – operator za kreiranje objekata na heapu
–
8.4.2007 32 / 46Algoritmi i strukture podataka, 2006/07.
Primjer za i d l t
-
8/16/2019 ASP Objektno orijentirano programiranje
33/46
Primjer za new i delete
class MojRazred
public:int _MojPodatak;
};
int main(int argc, char* argv[]) { MojRazred objStog; // objekt na stogu
=._
MojRazred *pStog = new MojRazred(); // objekt na heap u pStog->_MojPodatak = 10;
delete pStog; // moramo eksplicitno osloboditi memoriju
// po završetku funkcije, objStog će se automatski// ukloniti iz memorije
}
8.4.2007 33 / 46Algoritmi i strukture podataka, 2006/07.
B i j lj
-
8/16/2019 ASP Objektno orijentirano programiranje
34/46
Brisanje polja
new i delete nisu namijenjeni isključivo za kreiranje i uništavanje objekata: predstavljaju općenitu zamjenu za malloc i realloc type safe verzija – točno se zna za kakav tip podatka se alocira memorija
primjeri:float *pFloat = new float;int *pInt = new int[10];char * Strin = new char 20
delete pFloat;delete [] pInt;
za brisanje polja mora se koristiti operator delete []
delete [] pString;
P06_Primjer_new_delete
8.4.2007 34 / 46Algoritmi i strukture podataka, 2006/07.
Inicijalizacija objekta
-
8/16/2019 ASP Objektno orijentirano programiranje
35/46
Inicijalizacija objekta
kreiranje objekta ipak ne znači samo alokaciju memorije za smještanje objekta bitno e u kakvom stan u se ob ekt nalazi nakon kreiran a odnosno kakve su mu vri ednosti
članskih varijabli
problem inicijalizacije javlja se i u C-u:
nakon deklaracije int a; nije jednoznačno definirano kakvu vrijednost ima varijabla a
o o e a a e s var ma o s o en a er v ero a no ma u v e ans var a kako inicijalizirati pokazivače koji su dio razreda?
“ ”funkcija Inicijaliziraj() koja dovodi kreirani objekt u ispravno stanje
a što ako kreiramo ob ekt i zaboravimo ozvatiInici alizira ? pogreška pri korištenju objekta!
8.4.2007 35 / 46Algoritmi i strukture podataka, 2006/07.
Pojam konstruktora objekta/razreda
-
8/16/2019 ASP Objektno orijentirano programiranje
36/46
Pojam konstruktora objekta/razreda
uvodimo pojam konstruktora objekta posebna članska funkcija namijenjena inicijalizaciji stanja objekta kod njegovog kreiranja prepoznaje se po imenu funkcije – mora biti isto kao i ime razreda
sintaksa: public: MojaKlasa() { ... } // konstruktor bez parametara
Prim er reo terećena overloadin a funkci e
...
};
imamo funkcije istog imena (u C-u nije dozvoljeno) a prevodilac ih razlikuje po parametrima
konstruktor nema povratnog parametra – ne vraća i ne može vratiti nikakavpo a a na on zvr avan a a ako dođe do pogreške koju treba signalizirati ostatku programa – treba “baciti” izuzetak
(engl. exception)
8.4.2007 36 / 46Algoritmi i strukture podataka, 2006/07.
Podrazumijevani konstruktor
-
8/16/2019 ASP Objektno orijentirano programiranje
37/46
Podrazumijevani konstruktor
Primjer korištenja:
MojaKlasa a;
MojaKlasa b(10);o a asa c = new o a asa ; MojaKlasa *d = new MojaKlasa(10);}
a kako su onda radili naši prethodni primjeri (bez definiranog
prevodilac za svaki razred za koji nije eksplicitno definiran
. konstruktor bez parametara koji članske varijable inicijalizira na neke
8.4.2007 37 / 46Algoritmi i strukture podataka, 2006/07.
Destruktori
-
8/16/2019 ASP Objektno orijentirano programiranje
38/46
Destruktori
definiranjem konstruktora smo “pokrili” kreiranje objekta, a što je s
možemo definirati destruktor razreda ans a un c a o a e se poz va pr om un avan a o e a
“uništavanje” objekta = brisanje objekta iz memorije
tehnič
kim žargonom – objekt izlazi iz dosega (engl. goes out of scope) za objekte kreirane na stogu – trenutak kada funkcija u kojoj su deklarirani
završava i briše sve svoje podatke sa stoga za objekte kreirane na heapu – trenutak kad se nad njima poziva delete
ako je u razredu definiran destruktor, prevodilac će ga automatskipozvati u trenutku uništavanja objekta
8.4.2007 38 / 46Algoritmi i strukture podataka, 2006/07.
Primjer sintakse
-
8/16/2019 ASP Objektno orijentirano programiranje
39/46
Primjer sintakse
class MojaKlasa {
MojaKlasa() { ... } // konstruktor 1
MojaKlasa(int a) { ... } // konstruktor 2~MojaKlasa() { ... } destruktor (jedan!)
};
void main() { MojaKlasa a; Mo aKlasa *b = new Mo aKlasa();... // tijelo funkcijedelete b; // poziva se destruktor za b(eksplicitno)
// poziva destruktor za a
P06_PrimjerKonstruktorDestruktor
8.4.2007 39 / 46Algoritmi i strukture podataka, 2006/07.
Curenje memorije
-
8/16/2019 ASP Objektno orijentirano programiranje
40/46
Curenje memorije
isto pitanje – kako su radili naši prijašnji primjeri u kojima nije bilo destruktora? uništavanje objekta je podrazumijevalo samo oslobađanje memorije (alocirane za smještaj
samog objekta) i to za to se pobrinuo prevodilac destruktor je “glumila” funkcijaIzbrisi() koja je oslobađala zauzetu memoriju
Imamo curenje memorije (memory leak) u programu – zauzeli smo resurse računala ali ih
nismo oslobodili iako ih više ne koristimo za oravnos programera u a v m s u a ev ma mo e vo zraz o nezgo n m
pogreškama rednost destruktora – revodilac će se obrinuti da se ozove funkci a za
uništavanje objekta nakon što definiramo destruktor, sigurni smo
-new) mora se pozvati delete!
- kreator objekta određuje kada će se on uništiti
P06_DinamickoPolje_Cpp3_konstruktori
8.4.2007 40 / 46Algoritmi i strukture podataka, 2006/07.
Kopiranje objekata
-
8/16/2019 ASP Objektno orijentirano programiranje
41/46
Kopiranje objekata
što je s kopiranjem objekata? .
za obične tipove (int, float, char) je to jednostavno – u funkciji se
kreira lokalna vari abla isto ti a i automatski inici alizira s renesenomvrijednošću
a što ako se prenosi objekt?
void NekaFunkcija(MojaKlasa obj) {...
}void main() { MojaKlasa a;
NekaFunkcija(a);}
8.4.2007 41 / 46Algoritmi i strukture podataka, 2006/07.
Sintaksa copy-constructora
-
8/16/2019 ASP Objektno orijentirano programiranje
42/46
Sintaksa copy constructora
osnovno pitanje – pomoću kojeg konstruktora se kreira lokalni objekt objprilikom poziva funkcije NekaFunkcija()?
poziva se tzv. copy-constructor a gdje je on u našem razredu? – nema ga eksplicitno, ali je prevodilac sam definirao
“ ”
Sintaksa:class Mo aKlasa public: MojaKlasa() { ... } // konstruktor 1 MojaKlasa(int a) { ... } // konstruktor 2 Mo aK asa const Mo aK asa & n tO ... copy-constructor~MojaKlasa() {} // destruktor
};
copy-constructor se prepoznaje po svom parametru – prima referencu naobjekt istog tipa koji će poslužiti kao osnova za kreiranje novog objekta
=
8.4.2007 42 / 46Algoritmi i strukture podataka, 2006/07.
Problem s copy-constructorom
-
8/16/2019 ASP Objektno orijentirano programiranje
43/46
Problem s copy constructorom
podrazumijevana implementacija copy-constructora radi samo
novostvorenog objekta
objekti koji u sebi nemaju pokazivače na alocirane resurse (memorija,
, , ...
neispravan za naš razred DinamickoPolje objekt kreiran pomoću podrazumijevanog copy-construktora će pokazivati
na istu memoriju alociranu za polje
nam c o o e - NE! – od početka se radi o call by value!
- ,pokazivač na objekt
8.4.2007 43 / 46Algoritmi i strukture podataka, 2006/07.
Dva načina kopiranja objekata
-
8/16/2019 ASP Objektno orijentirano programiranje
44/46
Dva načina kopiranja objekata
postoje dva načina kopiranja objekata – -
novu kopiju objekta- za razred DinamickoPol e to znači alociran e nove memori e i inici alizaci u
elemenata u tom polju s vrijednostima iz objekta predanog copy-constructoru
shallow copy – kreira se novi objekt, ali on nastavlja “dijeliti” određeni diostanja s objektom na temelju kojega je nastao
- za DinamickoPolje to znači da nakon kreiranja objekta pomoću copy-
- doći će do problema kad se pozovu destruktori za ta dva objekta prvi poziv destruktora će proći u redu, ali kad se pozove destruktor za drugi objekt,
po u a os o a an a ve os o o ene memor e e uzro ova pogre u
P07_DinamickoPolje_Cpp4_copy_constructor
8.4.2007 44 / 46Algoritmi i strukture podataka, 2006/07.
Reference
-
8/16/2019 ASP Objektno orijentirano programiranje
45/46
Reference
referenca = pokazivač s malo drugačijom sintaksom
prevodilac to obavlja automatski
e arac a re erence se prepozna e po pre su &
Primjer: P07_PrimjerReference
void main() {int a = 5;
int *pa = &a; // pokazivač pa pokazuje na varijablu aint &ra = a; // referenca ra takođ er referencira varijablu a
*pa = 10; // varijabla a sada je jednaka 10
ra = 15; // a e sada ednako 15}
8.4.2007 45 / 46Algoritmi i strukture podataka, 2006/07.
Primjeri:
-
8/16/2019 ASP Objektno orijentirano programiranje
46/46
j
razred Trokut:
geometrijskog lika koji ima definiranu duljinu svake od tri stranice i
u rađenu funkcionalnost za izračunavan e ovršine i o se a trokuta
P08_Trokut
izgraditi razred KompleksniBroj koji će predstavljati (matematički)
.predstavljati realni i imaginarni dio i pružati funkcionalnost za obavljanjematematičkih operacija s kompleksnim brojevima (zbrajanje, oduzimanje,množenje i dijeljenje)
P09 Kom leksniBro _
8.4.2007 46 / 46Algoritmi i strukture podataka, 2006/07.