1
Klasa
Uvodimo klju nu rije classKlasa poop ava pojam strukture iz C-a
Razlika izme u klase (class) i strukture (struct) u jeziku C++Sa stanovi ta C++ prevoditelja primarno sintaksna kod strukture je sve podrazumijevano public dok je kod razreda sve podrazumijevano private
Konceptualna razlika:Struktura je (ipak) namijenjena modeliranju skupa jednostavnih podataka nad kojima ostali dijelovi programa direktno operirajuKlasa kao primarni koncept OO paradigme (prisutan u svim OO jezicima!) je namijenjen modeliranju (predstavljanju) koncepata iz podru ja problema koji rje avamo (DinamickoPolje, Stog, HashFile, ...) koji imaju slo eno pona anje realizirano preko skupa lanskih funkcija
2
Primjer:P05_DinamickoPolje_Cpp2_prava_pristupa
class DinamickoPolje{public:
int Inicijaliziraj(int inMaxBrojElem);void Izbrisi();int PostaviNovuVelicinu(int NoviBrojElem);
void PostaviElement(int Indeks, int Vrijednost);int DohvatiElement(int Indeks);int DodajElementNaKraj(int Vrijednost);
int BrojElemenata();
private:int *_Podaci;
int BrojElem; // koliko stvarno ima elemenata u poljuint MaxBrojElemenata; // maksimalni raspolo ivi prostor
};
3
Apstrakcija i enkapsulacijaosnovni elementi OO paradigme
Apstrakcija odbacivanje onoga to je sporedno, posebno i slu ajno radi onoga to je op e, zakonito i bitnoEnkapsulacija (u ahurivanje) -onemogu avanje pristupa varijablama klaseosim putem ugra enih metoda za njihovoitanje i pisanje. Time se osigurava da objekt
ne mo e do i u neko nepredvi eno stanje izbilo kojeg razloga
4
A & E (nastavak)Apstrakcija
Apstrakcija klase / objekti predstavljaju koncepte iz domene problema koji rje avamo
Klasa DinamickoPoljeApstrakcija koncepta dinami kog polja s dobro definiranim karakteristikama
Nije li to isto i struktura u C-u?Struktura predstavlja agregatni skup podataka nad kojima operiraju vanjski elementi programa (funkcije)
Vanjske funkcije nisu dio strukture zbog toga struktura nije potpuna jer je za razumijevanje koncepta koji predstavlja potrebno
prou iti ne to to nije dio same definicije struktureStruktura nije zatvorena u smislu da ne upravlja sama svojim pona anjem i stanjem!Modeliranjem koncepta pomo u klase rje avamo navedene probleme
5
Enkapsulacijaniti jedan dio slo enog sustava ne bi smio ovisiti
o unutra njim detaljima drugog dijela
unutra nji detalji korisnika klase DinamickoPolje uop e ne treba zanimati kako je realizirana njegova funkcionalnost
A & E (nastavak)Enkapsulacija
6
Primjer DinamickoPoljeimplementacija
Koncept dinami kog polja je vrlo jednostavan i prakti ki implicira na in implementacije (dinami ka alokacija memorije za elemente polja), ali kod slo enijih klasa 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 klase, mo e se izraditi vlastiti modul za upravljanje memorijom (ne koristimo malloc i realloc, ve vlastitu implementaciju npr. radi efikasnosti)
7
Primjer DinamickoPoljeenkapsulacija
Enkapsulaciju posti emo deklariranjem unutra njih detalja razreda kao privateBudu i da tada ionako ne mo e pristupiti tim dijelovima, korisnik klase DinamickoPolje ne mo e o njima ni ovisiti (zato jer ih ne mo e izravno referencirati u programskom kodu kojega on pi e)
8
Javno su elje klase
Sve to je u klasi deklarirano kao public dio je javnog su elja klaseJavno su elje klase predstavlja prozor u svijet kroz koji razred komunicira s ostalim dijelovima programaDefiniranjem lanskih varijabli kao private, klasa skriva svoje stanje
9
Enkapsulacijau stvarnom ivotu i u programiranju
Svaki sustav kod kojega nije bitno kakoradi ve to radiPostoji su elje putem kojega korisnik komunicira sa sustavom (npr. daljinski upravlja - Play, Stop, Eject, ... )
Za korisnika klase DinamickoPolje je bitno da klasa ima o ekivano pona anje, a kako je unutar klase omogu eno takvo pona anje, korisnika (uglavnom) ne zanima!
10
Pojam
Ovako izgleda deklaracija klase (novi tip podatka):
class MojaKlasa {...
};Sli no kao i kod struktura, klasa predstavlja predlo ak iz kojega e se kreirati objekti
Kod struktura se konkretna instanca strukture naziva varijabla struktureKod klase se konkretna instanca klase naziva se naziva objekt
Klasa je jedna, a iz nje se mo e instancirati proizvoljan broj objekataSvi objekti imaju isti skup lanskih varijabli i lanskih funkcijaObjekti se razlikuju po vrijednostima koje imaju njihove lanske varijable (te vrijednosti predstavljaju stanje objekta)
Analogija sa strukturom polje svi lanovi su istog tipa, a vrijednosti im se razlikuju za svaki indeks polja
11
Kreiranje objekataSli no kao i kod struktura, kreiranje objekta primarno podrazumijeva alociranje prostora u memoriji gdje e objekt (odnosno njegove lanske varijable) biti smje ten
Mogu a su dva standardna na ina:Smje tanje objekta na stog - Objekt se deklarira kao lokalni objekt unutar funkcijeSmje tanje objekta na heap (gomilu) - ivotni vijekobjekta nije vezan uz kontekst izvo enja funkcije ve se objekt eksplicitno mora uni titi (izbrisati iz memorije)
12
Heap - gomila
Za potrebe rada s objektima na heap-u, uvedena su dva nova operatora:new operator za kreiranje objekata na heap-udelete operator za brisanje objekata s heap-a
13
Primjer za new i delete
class MojaKlasa{public:
int _MojPodatak;};
int main(int argc, char* argv[]){
MojaKlasa objStog; // objekt na stoguobjStog._MojPodatak = 10;
MojaKlasa *pStog = new MojaKlasa(); // objekt na heap-upStog->_MojPodatak = 10;
delete pStog; // moramo eksplicitno osloboditi memoriju
return 0;// po zavr etku funkcije, objStog e se automatskiukloniti iz memorije
}
14
new i delete nisu namijenjeni isklju ivo za kreiranje i uni tavanje objekata:
Predstavljaju op enitu zamjenu za malloc i rea llocType safe verzija to no se zna za kakav tip podatka se alocira memorija
Jo o new i delete
15
Primjer: P06_Primjer_new_delete
float *pFloat = new float;
int *pInt = new int[10];
char *pString = new char[20];
delete pFloat;
delete [] pInt;
delete [] pString;
Za brisanje polja mora se koristiti operator delete []
16
Kreiranje objekta ipak ne zna i samo alokaciju memorije za smje tanje objekta !
Bitno je u kakvom stanju se objekt nalazi nakon kreiranja, odnosno kakve su mu vrijednosti lanskih varijabli - problem inicijalizacije !
Javlja se i u C-u:Nakon deklaracije int a; nije jednozna no definirano kakvu vrijednost ima varijabla a
Kod objekata je stvar jo slo enija jer mogu imati vi e lanskih varijabli
Kako inicijalizirati pokaziva e koji su dio klase ?!
17
Inicijaliziranje objekta
Rje avanju ovog problema kod klaseDinamickoPolje je namijenjena funkcija Inicijaliziraj() koja dovodi kreirani objekt u ispravno stanje
to ako kreiramo objekt i zaboravimo pozvati funkciju Inicijaliziraj() ?
Dolazi do pogre ke kod kori tenja objekta
18
Sljede i put
Konstruktori
19
Pojam konstruktora objekta/klase
Specijalna lanska funkcija namijenjena inicijalizaciji stanja objekta kod njegovog kreiranjaPrepoznaje se po imenu funkcije mora biti isto kao i ime razreda
class MojaKlasa {public:
MojaKlasa() { ... } // konstruktor bez parametara
MojaKlasa(int a) { ... } // konstruktor s parametrom
};
20
Primjer overloading-a (preoptere enja) funkcijeImamo funkcije istog imena (u C-u nije dozvoljeno) a prevoditelj ih razlikuje po parametrima !
Konstruktor nema povratnog parametra ne vra a i ne mo e vratiti nikakav podatak nakon izvr avanja !
A ako do e do pogre ke koju treba signalizirati ostatku programa treba baciti izuzetak (engl. exception)
21
Primjer kori tenja:void main() {
MojaKlasa a;MojaKlasa b(10);MojaKlasa *c = new MojaKlasa();MojaKlasa *d = new MojaKlasa(10);
}
A kako su onda radili na i prethodni primjeri (bez definiranog konstruktora) ?Prevodilac za svaki razred za koji nije eksplicitno definiran konstruktor sam dodaje podrazumijevani (engl. default) konstruktor