Professional Documents
Culture Documents
Klase1
Klase1
classes)
O klasama
19
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Deklarisanje klase
class Osoba {
private:
string ime;
int visina;
public: tijelo klase – članovi klase
string ispisiIme() const;
void datiIme(string);
int ispisiVisinu() const;
void datiVisinu(int);
};
20
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Deklarisanje objekta
Članovi klase
class Osoba {
private:
članovi podaci
string ime;
(data members)
int visina;
public:
string ispisiIme() const; članovi funkcije,
void datiIme(string); metode (member
int ispisiVisinu() const; funcions)
void datiVisinu(int);
};
Enkapsulacija - softverska tehnika kojom se povezuju podaci i metode (radnje) koje se odnose na te
podatke u jednu cjelinu
22
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
23
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Članovi metode (funkcijski članovi, member functions) – čine javni interfejs (sučelje)
class Osoba {
..........
public:
string ispisiIme() const;
void datiIme(string);
int ispisiVisinu() const;
void datiVisinu(int);
};
Naziv funkcijskog objekta mora biti jedinstven u području imena unutar klase. Dakle,
možemo imati funkciju datiIme(string) izvan klase Osoba.
24
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Definisanje klase
class Tacka {
int xKoor, yKoor;
public:
void defTac (int, int);
void pomTac (int, int);
};
ili
class Tacka {
public:
void defTac (int, int);
void pomTac (int, int);
private:
int xKoor, yKoor;
};
25
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Definisanje metoda
Definisanje objekta
#include <iostream>
class Skup {
public:
void PrazanSkup (void) { kardBroj = 0; }
bool Clan (const int);
void DodajClan (const int);
void IzbrisiClan (const int);
void Kopiraj (Skup&);
bool Jednak (Skup&);
void Presjek (Skup&, Skup&);
void Unija (Skup&, Skup&);
void Ispisi (void);
private:
int clanovi[maxKardBroj]; // definisi clanove
int kardBroj; // definisi kardinalan broj
};
27
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Definisanje metoda
28
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Definisanje metoda
29
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Definisanje metoda
30
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Definisanje metoda
Pomoću operatora . (tačka) – u slučaju identifikacije nazivom objekta ili preko reference
► sa lijeve strane operatora se navede naziv objekta ili referenca
► sa desne strane operatora se navede naziv člana kojem se pristupa
32
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Pomoću operatora -> (minus i veće od) – u slučaju identifikacije preko pointera, tj ako
imamo pointer na objekat klase
► sa lijeve strane operatora se navede pointer
► sa desne strane operatora se navede naziv člana kojem se pristupa
33
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Skrivenom parametru se može pristupiti unutar same funkcije preko ključne riječi this.
this se često koristi kada je potrebno vratiti pointer ili referencu na objekat – slučajevi
preopterećivanja operatora.
34
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Umetnute funkcije
Funkcije mogu biti veoma kratke, pa sam poziv (stvaraju se i inicijaliziraju varijable) može
trajati duže od njenog izvršavanja
Dodavanjem ključne riječi inline ispred definicije funkcije daje se instrukcija prevodiocu da
pokuša svaki poziv funkcije nadomjestiti kodom funkcije.
Umetnute metode
inline void Tacka::defTac (int x,int y)
{
xKoor = x;
yKoor = y;
}
ili
class Tacka {
int xKoor, yKoor;
public:
void defTac (int x,int y) { xKoor = x; yKoor = y; }
void pomTac (int x,int y) { xKoor += x; yKoor += y; }
};
Funkcijski član definisan na posljednji način (unutar deklaracije klase) je uvijek umetnut, bez
eksplicitnog korištenja ključne riječi inline.
36
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Dodjela prava pristupa
• Privatni (private) – lokalni članovi (pristup imaju samo članovi klase) – ne može im se pristupiti
‘izvana’ ili izvedenim klasama, nego samo unutar klase u kojoj su definisani ovi članovi
• Javni (public) – javni članovi (prisup imaju svi korinici klasa) – može im se pristupiti ‘izvana’
• Zaštićeni (protected) – zaštićeni članovi (pristup imaju samo članovi klase i izvedenih klasa) – ne može im
se pristupiti ‘izvana’, nego samo članovima klase u kojoj su defnisani, te izvedenim klasama.
class Pristup{
public:
int a,b;
void funkcija1(int brojac);
private:
int c;
protected:
int d;
int funkcija2();
}; Dev C++ – primjer klase Skup – pravilaPristupa.cpp
Redoslijed navođenja prava je proizvoljan, a moguće je i ponavljanje.
Ako se eksplicitno ne navede pravo pristupa, za članove klase se podrazumijeva privatni pristup
37
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Prijatelji klase (eng. friends)
Za obezbjeđenje pristupa neke funkcije, funkcijskog člana ili čitave klase članovima klase koji nisu
javni funkcija se deklariše kao prijatelj datoj klasi – koristi se u sljedećim slučajevima:
Definisati funkciju koja pretvara skup realnih u skup prirodnih brojeva, kao funkcijski
član klase SkupR!
38
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Rjesenje 1: obična funkcija kao član klase SkupR
class SkupR {
public:
SkupRuN (SkupN &skup);
//..
private:
int clanovi[maxKardBroj];
int kardBroj;
};
Funcija SkupRuN, kao funkcijski član klase SkupR, je prijatelj klase SkupN, tako da ova
funkcija može koristiti privatne i zaštićene članove klase SkupN
• Iza ključne riječi friend navodi se prototip funkcije; funkciju nije potrebno deklarisati prije
• U slučaju više funkcija prijatelja, sva se deklariše posebno
• Definicija friend funkcije može se uraditi na bilo kojem mjestu u tijelu klase, ali se to najčešće
radi odmah iza deklaracije klase
• Prije dodjele prava psristupa funkcijskom članu, funkcijski član mora biti deklarisan
(deklaracija klase skupN prethodi deklarisanju klase SkupR)
Dev C++ primjer – friends2.cpp
40
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Rjesenje 3: globalna funkcija kao prijatelj obe klase
class A;
class B {
//...
friend class A;
};
41
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)
class Tacka {
int xKoor, yKoor;
public:
void defTac (int, int);
void pomTac (int, int);
};
class Tacka {
int xKoor, yKoor;
public:
Tacka (int x,int y) {xKoor = x; yKoor = y;} // konstruktor umjesto funkcije defTac
void pomTac (int,int);
};
class Tacka {
int xKoor, yKoor;
public:
Tacka (int x, int y) { xKoor = x; yKoor = y; }
Tacka (double, double); // polarne koordinate
Tacka (void) { xKoor = yKoor = 0; } // koordinatni pocetak
void pomTac (int, int);
};
U slučaju poziva konstruktora bez parametara, ne smiju se navesti zagrade () nakon naziva objekta –
prevoditelj to ne shvata kao deklaraciju objekta nego kao deklaraciju funkcije bez argumenata koja vraća
objekat!!!
Osnovni zadatak konstruktora je da inicijalizira objekat i na taj način dodijeli određeni memorijski prostor
(ali ne i za pohranjivanje članova objekta)!!!
44
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)
class Skup {
public:
void PrazanSkup (void) { kardBroj = 0; }
// ...
};
class Skup {
public:
Skup (void) { kardBroj = 0; }
//...
};
class Skup {
public:
Skup (const int velicina);
//...
private:
int *clanovi; // pridruzi clanove
int maxKardBroj; // maksimalan kardinalni broj
int kardBroj; // pridruzi kardinalan broj
};
class Slika {
public:
Slika (const int b, const int h);
private:
int sirina;
int visina;
//...
};
Slika::Slika (const int b, const int h)
{
sirina = b;
visina = h; Ne radi se o klasičnoj inicijalizaciji
//... nego o pridruživanju vrijednosti već
} inicijaliziranim članovima!!!
class Slika {
public:
Slika (const int b, const int h);
private:
int sirina;
int visina;
//...
};
Za razliku od običnih funkcija članove konstrukotra moguće je inicijalizirati prije samog tijela konstruktora!!!
Bitno je paziti na redosljed inicijalizacije – članovi podaci se moraju inicijalizirati prema redosljedu navedenom u
deklaraciji, a ne inicijalizacijskoj listi!!!
Dev C++ – konstruktoriInic2.cpp
48
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)
class Podrazumijevani {
int broj;
Tacka tac1;
};
Prevodilac sam generira podrazumijevani konstruktor koji ostavlja član broj neinicijaliziran, dok
za član tac1 traži podrazumijevani konstruktor. Ukoliko podrazumijevani konstruktor klase
Tacka ne postoji, prevodilac prijavljuje grešku.
Prevodilac generira podrazumijevani konstruktor ako klasa nema definisan nijedan drugi
konstruktor, te ako ne sadrži konstantne članove ili reference.
NO!!! Klase koje sadrže pointere na dinamički alocirane segmente memorije gotovo uvijek traže
korisnički definisan konstruktor kopije.
Dev C++ – konstruktoriKopija.cpp
50
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)
Inicijalizacija referenci
U klasama se referenca može deklarirati, ali za različite objekte iste klase može
referirati različite podatke!!!
class Slika {
public:
Slika (const int b, const int h);
private:
int sirina;
int visina;
int &refVisina;
//...
};
51
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)
class Slika {
public:
Slika (const int b, const int h);
private:
int sirina;
int visina;
int &refVisina = visina; // nepravilno
//...
};
class Slika {
const int sirina;
const int visina;
//...
};
class Slika {
const int sirina = 256; // nepravilan inicijalizator!
const int visina = 168; // nepravilan inicijalizator!
//...
};
53
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)
class Slika {
public:
Slika (const int b, const int h);
private:
const int sirina;
const int visina;
//...
};
Slika::Slika (const int b, const int h) : sirina(b), visina(h)
{
//...
}
class Skup {
public:
Skup (const int velicina);
~Skup (void){delete clanovi}; // destruktor
//...
private:
int *clanovi; // pridruzi clanove
int maxKardBroj; // maksimalan kardinalni broj
int kardBroj; // pridruzi kardinalan broj
};
Destruktor se automatski poziva u slučajevima:
• Za automatske objekte na kraju bloka u kojem je definisan objekat
• Za statičke i globalne objekte nakon izlaska iz funkcije main()
• Za dinamičke objekte prilikom uništenja dinamičkog objekta operatorom delete
Dev C++ – destruktor.cpp Dev C++ – destruktor1.cpp
55
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Polja objekata
Tacka pentagon[5];
Klasa Tacka mora imati konstruktor koji se poziva bez argumenata (podrazumijevani
konstruktor)!!!
Tacka pentagon[5] = {
Tacka(10,20), Tacka(10,30), Tacka(20,30), Tacka(30,20)
};
pentagon[4] ima vrijednost (0,0) koja je pridružna preko konstruktora bez argumenata
Tacka pentagon[5] = {
Tacka(10,20), Tacka(10,30), Tacka(), Tacka(30,20), Tacka(30,30)
};
56
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Polja objekata
Uništavanje (dealokacija) dinamički alociranih polja objekata se vrši pomoći naredbe delete
delete [] poligon;
Upotreba [ ] je obavezna, jer bi bez zagrada bio uništen samo prvi objekat!!!
57
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Polja objekata
class Poligon {
public:
//...
private:
Tacka *vrhovi; // vrhovi poligona
int nVrhovi; // broj vrhova
};
58
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstantni članovi metode
class Skup {
public:
Skup (void) { card = 0; }
bool Clan (const int);
void DodajClan (const int);
void Ispisi () const;
};
Ključna riječ const završava definiciju liste parametara, i nalazi se i u deklaraciji i u definiciji
(funkcijski član ne mijenja vrijednost objekta)
59
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstantni članovi metode
const Skup s;
s.DodajClan(10); // nepravilno: DodajClan nije konstantan član
s.Ispisi(10); // OK
Konstantnost je dio potpisa funkcije pa klasa može sadržavati i konstantnu i nekonstantnu verziju
funkcijskog člana sa istim parametrima.
class Skup {
public:
Skup (void) { card = 0; }
bool Clan (const int);
void Ispisi () const;
void Ispisi () ;
};
class Skup {
public:
#include <cstring>
class Tekst{
private:
char *znaki;
public:
void mijenjaj(const char *rijec) const;
};
• Na ovaj način se osigurava da postoji tačno jedna kopija člana podatka, koju dijele svi
objekti klase – zajednički su za sve objekte neke klase.
• Omogućavaju da se podaci dijele između objekata iste klase
class Brojeni {
public:
static int Brojac; // statički član podatak
int MojBroj;
Brojeni();
~Brojeni();
void IspisiBrojace();
};
Brojeni::Brojeni() : MojBroj(Brojac++) {
cout << "Stvoren element br.: " << MojBroj << endl;
}
64
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Statički članovi
Statički članovi funkcije
• Slično globalnoj funkciji kao prijatelju klase, ali bez pristupa izvan klase
• Mogu se pozivati bez objekta, navodeći puno ime funkcije
• Ime obuhvata naziv klase, odvojen operatorom :: od naziva člana.
class Brojeni {
public:
static int Brojac; // statički član podatak
int MojBroj;
//...........
static int VrijednostBrojaca(){return Brojac;}
};
class Brojeni {
//...........
static int VrijednostBrojaca();
};
int VrijednostBrojaca(){return Brojac;}
Dev C++ – brojeniFunk.cpp
65
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Područje klase (eng. class scope)
66
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Objekti klase kao članovi (ugniježdene klase – eng. nested classes)
class Pravougaonik {
public:
Pravougaonik (int lijevo, int gore, int desno, int dole);
//...
private:
Tacka goreLIjevo;
Tacka doleDesno;
};
Pravougaonik:: Pravougaonik (int lijevo, int gore, int desno, int dole)
: goreLijevo(lijevo,gore), doleDesno(desno,dole)
{
}
Tok inicijalizacije
67
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
class Tacka {
public:
int xKoor, yKoor;
void defTac (int, int);
void pomTac (int, int);
};
Neispravno je primijeniti operator za uzimanje adrese (&) na član klase i dodijeliti rezultat pointeru
na cijeli broj, jer xKoor nije smješteno u memoriji računara!!!
68
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
Tacka tac1;
int *pClanObjekta = &tac1.xKoor; // ispravno
Adresa člana je dio objekta!!!
Class Elipsa{
public:
int cx,cy,velikaPoluosa;
double ekscentricitet;
};
Class Linija{/*................*/}
// ................
Svrha pointera na član klase je identifikacija pojedinog člana – on ne sadrži adresu nekog konkretnog
objekta u memoriji, nego njegovu vrijednost jednoznačno identificira neki član klase.
69
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
Pristup se ostvaruje pomoću operatora:
► .* (tačka i zvjezdica) – s lijeve strane je objekat kojem se želi pristupiti, a sa desne
pointer na član
► ->* (minus i veće i zvjezdica) – s lijeve strane je pointer na objekat kojem se želi
pristupiti, a sa desne pointer na član
Linija objLinija;
Linija *pLinija = &objLinija;
int main(){
int Linija::*pCijeli = &Linija::X1;
// pristup preko .*
objLinija.*pCijeli = 7;
pCijeli = &Linija::Y1;
70
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
class GrafObjekat{
// .......
public:
void Crtaj();
int Gore();
int Dole();
int Lijevo();
int Desno();
void PostaviVelicinu(int sirina, int visina);
71
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
Pointer metode odgovara adresi bilo koje metode klase GrafObjekat koja kao argumente uzima
dva pointera na cijeli broj, a nema povratne vrijednosti.
?
pNaFClan = GrafObjekat::Gore; pNaFClan = &GrafObjekat::Gore;
72
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
73
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
void (GrafObjekat::*dvaparam)(int,int);
dvaparam = GrafObjekat::PostaviVelicinu;
(grObj.*bezparam)();
grObj.*bezparam(); grObj.*(bezparam());
NEPRAVILNO!!!
Pozivanje funkcije bezparam(), vezivanje njene vrijednosti za
operator .*, te pristupanje članu – bezparam nije pointer na
funkciju!!!
75
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
Pointeri na funkcijske članove zavise od potpisa funkcije – pointeru je moguće dodijeliti samo pointere
na članove koji imaju istu povratnu vrijednost i iste parametre, te pripadaju istoj klasi.
bezparam = GrafObjekat::PostaviVelicinu;
//pogresno!!! Postavi velicinu ima dva parametra, a
// bezparam je deklarisan kao pointer na clan
// koji nema parametara
bezparam = GrafObjekat::Crtaj;
//pogresno!!! Crtaj ne vraca vrijednost, a
// bezparam je deklarisan kao pointer na clan
// koji vraca cjelobrojnu vrijednost
76
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase
Pointeri na funkcijske članove zavise od potpisa funkcije – pointeru je moguće dodijeliti samo pointere
na članove koji imaju istu povratnu vrijednost i iste parametre, te pripadaju istoj klasi.
class DrugaKlasa{
public:
int FunkClan();
};
bezparam = DrugaKlasa::FunkClan;
//pogresno!!! bezparam je deklarisan kao pointer na funkcijski
// clan klase GrafObjekat, a ne klase DrugaKlasa
77
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Strukture (eng. structures)
class Tacka {
struct Tacka {
public:
Tacka (int, int);
Tacka (int, int);
void pomTac (int, int);
void pomTac (int, int);
int x, y;
int x, y;
};
};
Slično klasama, mogu koristiti sve riječi za pravo pristupa (javni, zaštićeni, privatni)
78
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Unije (eng. unions)
Unije su klase kod kojih su svi članovi podaci mapirani na istu adresu unutar svog objekta
(kod klasa je to postavljeno u nizu)
– veličina objekta unije je jednaka veličini najvećeg člana
– definicija unije počinje ključnom riječju union
union Podatak {
int cijeli;
double realni;
char slovo;
//.......
};
Objekat tipa Podatak može pretpostaviti vrijednost proizvoljnog tipa, ali samo jednog u
pojedinim trenucima, tj. svi članovi dijele isti memorijski prostor.
Slično klasama, mogu koristiti sve riječi za pravo pristupa (javni, zaštićeni, privatni)
Mogu sadržavati objekte kalsa, ali da isti nemaju definisan ni konstruktor ni destruktor.
79
OOP I www.pf.unze.ba/OOPI