You are on page 1of 61

Klase (razredi, eng.

classes)
O klasama

Klase služe za definisanje novih tipova podataka

• reprezentacija objekata nekog tipa


• grupa operacija za manipulisanje objektima

19
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Deklarisanje klase

zaglavlje – ime klase i njene osnovnih klasa

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

Osoba student, ucenik, radnik;


Osoba razredDjaka[10];
Osoba *pokOsoba = &student;
Osoba &refOsoba = ucenik;

Dev C++ – primjer klase Osoba – osoba.cpp


21
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i 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);
};

Implementacija objekta – način na koji se ostvaruje reprezentacija objekta


Javni interfejs (sučelje) – definira saradnju objekta sa okolinom

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

Članovi podaci (podatkovni članovi, data members) – čine implementaciju objekta

class Osoba { class Osoba {


private: private:
float tezina; float tezina;
float visina; float visina;
char *ime; char *ime;
Osoba *student; Osoba student; \\ nepravilno
..............................
}; ..............................
};

Svi tipovi su dozvoljeni u deklaraciji, ako su do tog mjesta u programu definisani!!!


Nije moguće kao član klase deklarisati objekat koji se upravo definira (!!!)
Ali može sadržavati pointer ili referencu na elemenat iste klase

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

Primjer: klasa Tacka

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

void Tacka::defTac (int x, int y)


{
xKoor = x;
yKoor = y;
}
void Tacka::pomTac (int x, int y)
{
xKoor += x;
yKoor += y;
}

Definisanje objekta

Tacka tacka1; // kreiranje objekta tacka1 kao objekta klase Tacka

Dev C++ – primjer klase Tacka – tacka.cpp


26
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Primjer: klasa Skup

#include <iostream>

const maxKardBroj = 100;

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

bool Skup::Clan (const int element)


{
for (register i = 0; i < kardBroj; ++i)
if (clanovi[i] == element)
return true;
return false;
}

void Skup::DodajClan (const int element)


{
if (Clan(element))
return;
if (kardBroj < maxKardBroj)
clanovi[kardBroj++] = element;
else
cout << “Prekoracen maksimalan broj elemenata\n";
}

28
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Definisanje metoda

void Skup::IzbrisiClan (const int element)


{
for (register i = 0; i < kardBroj; ++i)
if (clanovi[i] == element) {
for (; i < kardBroj-1; ++i) // pomjeri clanove ulijevo
clanovi[i] = clanovi[i+1];
--kardBroj;
}
}

void Skup::Kopiraj (Skup &skup)


{
for (register i = 0; i < kardBroj; ++i)
skup.clanovi[i] = clanovi[i];
skup.kardBroj = kardBroj;
}

29
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Definisanje metoda

bool Skup::Jednak (Skup &skup)


{
if (kardBroj != skup.kardBroj)
return false;
for (register i = 0; i < kardBroj; ++i)
if (!skup.Clan(clanovi[i]))
return false;
return true;
}

void Skup::Presjek (Skup &skup, Skup &rezSkup)


{
rezSkup.kardBroj = 0;
for (register i = 0; i < kardBroj; ++i)
if (skup.Clan(clanovi[i]))
rezSkup.clanovi[rezSkup.kardBroj++] = clanovi[i];
}

30
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Definisanje metoda

void Skup::Unija (Skup &skup, Skup &rezSkup)


{
skup.Kopiraj(rezSkup);
for (register i = 0; i < kardBroj; ++i)
rezSkup.DodajClan(clanovi[i]);
}

void Skup::Ispisi (void)


{
cout << "{";
for (int i = 0; i < kardBroj-1; ++i)
cout << clanovi[i] << ",";
if (kardBroj > 0) // bez zareza nakon zadnjeg clana
cout << elems[kardBroj-1];
cout << "}\n";
}

Dev C++ – primjer klase Skup – skup.cpp


31
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Pristup članovima objekata

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

Tacka tacka1; // kreiranje objekta tacka1 kao objekta klase Tacka


Tacka &tacka2 = tacka1; // kreiranje reference

tacka1.defTac(10,20); // davanje koordinata (10,20) tacki tacka1


tacka1.pomTac(2,2); // pomjeranje tacke tacka1 za (2,2 ) – tacka1 postaje (12,22)
tacka2.pomTac(1,1); // pomjeranje tacke tacka1 za (1,1) preko reference

Tacka1.xKoor = 10; // nepravilno

tacka1.Tacka::pomTac(10,20); // puni poziv funkcijskog člana

32
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Pristup članovima objekata

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

Tacka *pokTacka = &tacka1; // kreiranje objekta tacka1 pomoću pointera

pokTacka->defTac(10,20); // davanje koordinata (10,20) tacki tacka1


pokTacka->pomTac(2,2); // pomjeranje tacke tacka1 za (2,2 ) – tacka1 postaje (12,22)

33
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

Ključna riječ this (this pointer)


Prilikom poziva svakog funkcijskog člana kao skriveni parametar (implicitni argument)
prosljeđuje se pointer na objekat kojemu taj član pripada.

Skrivenom parametru se može pristupiti unutar same funkcije preko ključne riječi this.

void Tacka::pomTac (int x, int y, Tacka *this){


void Tacka::pomTac (int x, int y){ this -> xKoor += x;
xKoor += x; this -> yKoor += y;
yKoor += y; Prevoditelj }
} interpretira
kao
Tacka::pomTac(2,2) Tacka::pomTac(2,2, &Tacka)

this se ne smije deklarirati kao formalni parametar funkcijskog člana!!!

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 metode (inline member functions)

Umetnute funkcije

Funkcije mogu biti veoma kratke, pa sam poziv (stvaraju se i inicijaliziraju varijable) može
trajati duže od njenog izvršavanja

double kvadrat(float x){


return x*x
}

Dodavanjem ključne riječi inline ispred definicije funkcije daje se instrukcija prevodiocu da
pokuša svaki poziv funkcije nadomjestiti kodom funkcije.

inline double kvadrat(float x){


return x*x
}

Ova instrukcija ne mora da bude ispoštovana od strane prevodioca, i savisi od kvaliteta


prevodioca.
35
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta

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:

• Jedini pravilan način za definisanje funkcije (Preopterećenje IO operatora)


• Neophodno ako se funkcija mora implementirati efikasno

class SkupN { class SkupR {


public: public:
//... //...
private: private:
int clanovi[maxKardBroj]; int clanovi[maxKardBroj];
int kardBroj; int kardBroj;
}; };

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;
};

void SkupR::SkupRuN (SkupN &skup)


{
skup.prazanSkup();
for (int i = 0; i < kardBroj; ++i)
skup.DodajClan((double) clanovi[i]);
}

Dev C++ primjer – friends.cpp


39
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Deklarisanje klase i objekta
Rjesenje 2: friend funkcija – pomoću ključne riječi friend

void skupR::SkupRuN (SkupN &skup) class SkupN {


{ //...
skup.kardBroj = kardBroj; friend void SkupR::SkupRuN (SkupN&);
for (int i = 0; i < kardBroj; ++i) };
skup.clanovi[i] = (double) clanovi[i];
}

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 SkupN { class SkupR {


//... //...
friend void SkupRuN (SkupN&, SkupR&); friend void SkupRuN (SkupN&, SkupR&);
}; };

void SkupRuN (SkupN &skupN, SkupR &skupR)


{
skupR.kardBroj = skupN.kardBroj;
for (int i = 0; i < skupN.kardBroj; ++i)
skupR.clanovi[i] = (double) skupN.clanovi[i];
} Dev C++ primjer – friends3.cpp

Skraceni oblik za slucaj da su sve metode klase A prijatelji klase B

class A;
class B {
//...
friend class A;
};

41
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

• Specijalne funkcije koje služe za definisanje i inicijalizaciju objekata


• Imaju isto ime kao klasa kojem pripadaju i nemaju povratni tip!!!

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);
};

Tacka tacka1 = Tacka(10,20);


Tacka tacka2; // nepravilno
Tacka tacka1(10,20);
Dev C++ – primjer konstruktoriOsnovno.cpp
42
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

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);
};

Tacka::Tacka (double duzina, double ugao) // polarne koordinate


{
xKoor = (int) (duzina * cos(ugao));
yKoor = (int) (duzina * sin(ugao));
}

Tacka tacka1(10,20); // Descartesove koordinate


Tacka tacka2(60.3,3.14); // polarne koordinate
Tacka tacka3; // koordinatni pocetak

Dev C++ – primjer konstruktori.cpp


43
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

Tacka tacka1(10,20); // Descartesove koordinate


Tacka tacka2(60.3,3.14); // polarne koordinate
Tacka tacka3; // koordinatni pocetak

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)

Primjer: klasa Skup

class Skup {
public:
void PrazanSkup (void) { kardBroj = 0; }
// ...
};

class Skup {
public:
Skup (void) { kardBroj = 0; }
//...
};

Dev C++ – primjer konstruktoriSkup.cpp


45
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

class Skup {
public:
Skup (const int velicina);
//...
private:
int *clanovi; // pridruzi clanove
int maxKardBroj; // maksimalan kardinalni broj
int kardBroj; // pridruzi kardinalan broj
};

Skup::Skup (const int velicina)


{
clanovi = new int[velicina];
maxKardBroj = velicina;
kardBroj = 0;
}

Skup starost(10), visina(20), primBrojevi(100);

Dev C++ – primjer konstruktoriSkup2.cpp


46
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

Liste za inicijaliziranje članova klase

Inicijalizacija se može ostvariti na sljedeće načine:

1. Pomoću znaka jednakosti u tijelu konstruktora

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!!!

Dev C++ – konstruktoriInic.cpp


47
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

2. Pomoću liste za inicijaliziranje članova klase (nije obavezno)

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)


{
//...
}

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)

Podrazumijevani konstruktor (default constructor)

Konstruktor bez parametara – automatski se poziva ukoliko u klasi nije


eksplicitno definisan nijedan konstruktor.

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.

Dev C++ – konstruktoriPodraz.cpp


49
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

Konstrutkor kopije (copy constructor) – za preslikavanje već postojećeg objekta


Konstruktor kopije se razlikuje od ostalih konstruktora po tome što ima samo
jedan parametar i to referencu na konstanti objekat iste klase.
class Slika {
public:
Slika (const Slika &refSlika) :sirina(&refSlika.sirina),visina(&refSlika.visina){};
private:
int sirina;
int visina;
//...
};
Slika slika1(100,200);
Slika slika2=slika1;
Slika slika3(slika2);

Konstruktor kopije ne mora postojati – prevodilac ga sam generiše!!!

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 i konstantnih članova (podataka)

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
//...
};

Jedino rješenje za inicijalizaciju referenci je preko incijalizacijske liste u


definisanju konstruktora!!!
class Slika {
public:
Slika (const int b, const int h);
private:
int sirina;
int visina;
int &refVisina;
//...
};

Slika::Slika (const int b, const int h) : refVisina(visina)


{
//...
} Dev C++ – konstruktoriInicRef.cpp
52
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstruktori (eng. constructors)

Inicijalizacija konstantnih članova podataka


Slično referencama, i konstantne (podatkovne) članove moramo inicijalizirati u
konstruktoru, a vrijednost im se kasnije ne može mijenjati.

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)

Korektan način za inicijalizaciju konstantnih članova klase je pomoću liste za


inicijaliziranje članova klase

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)
{
//...
}

Dev C++ – konstruktoriInicKonst.cpp


54
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Destruktori (eng. destructors)
• Specijalne funkcije koje služe za “čišćenje” objekta prije “uništenja”
• Imaju isto ime kao klasa, ali sa znakom ~ ispred
• Nema povratnog tipa, pa se ne može preopteretiti (klasa ima samo jedan destruktor)

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

Ako ne postoji podrazumijevani konstruktor, jedino je moguća inicijalizacija preko


inicijalizacijske liste!!!

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

Moguće je i dinamičko alociranje polja objekata sa:


Tacka *poligon = new pentagon[5];

U ovom slučaju nije moguće inicijaliziranje preko inicijalizacijske liste, pa


podrazumijevani konstruktor mora postojati.

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

U slučaju da se ne poznaje veličina niza (polja), koriste se nizovi sa dinamičkim


objektima:

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

Konstantne metode – za metode koje se mogu pozvati za konstantne objekte – pomoću


ključne riječi const
Postupak se uvodi radi onemogućavanja promjene konstantnih objekata preko funkcijskih članova!!!

class Skup {
public:
Skup (void) { card = 0; }
bool Clan (const int);
void DodajClan (const int);
void Ispisi () const;
};

void Skup::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

Konstantni funkcijski članovi su ograničeni isključivo na čitanje članova podataka!!!

Konstruktori i destruktori ne mogu biti konstantni!!!

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 () ;
};

Dev C++ – konstFunkClan.cpp


60
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstantni članovi metode
Moguće je promijeniti član podatak sa konstantnim članom metodom ako se ispred tog člana podatka
doda ključna riječ mutable!!!

class Skup {
public:

Skup (void) { kardBroj = 0; }


bool Clan (const int);
void DodajClan (const int);
void Ispisi () const;
private:
int clanovi[maxKardBroj]; // definisi clanove
mutable int kardBroj; // definisi kardinalan broj
};
void Skup::Ispisi () const
{
cout << "{";
for (int i = 0; i < kardBroj-1; ++i)
cout << clanovi[i] << ",";
kardBroj = 5;
}
Dev C++ – konstFunkClan2.cpp
61
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Konstantni članovi metode
Ako klasa sadrži pointere, objekti na koje ti pointeri pokazuju mogu se promijeniti unutar
konstantnog člana metode.

#include <cstring>

class Tekst{
private:
char *znaki;
public:
void mijenjaj(const char *rijec) const;
};

void Tekst::mijenjaj(const char *rijec) const{


for(unsigned int i=0; i<strlen(rijec); i++)
znaki[i] = rijec[i];
}

Dev C++ – konstFunkClan3.cpp


62
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Statički članovi

Statički članovi podaci

• 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;
}

Dev C++ – brojeni.cpp


63
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Statički članovi
Isto je moguće uraditi i sa globalnom varijablom, ali u ovom slučaju se omogućuje samo
određenoj klasi da manipuliše statičkom varijablom
Klasa može sadržavati statički objekat te klase!!!
class Brojeni {
public:
static Brojeni statickiClan;
Brojeni *pointer, &referenca;

Brojeni nestatickiClan; //neispravno


}
Statički članovi mogui biti navedeni kao podrazumijevani parametri članova metoda!!!
int a;
class Brojeni {
int a;
static int b;
public:
void funkc1(int =b;); //OK
void funkc2(int=::a;) //OK
void funkc3(int=a); //NEPRAVILNO
}

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)

1. Globalne klase – definisane globalno


2. Ugniježdene klase – definisane u području neke druge klase (može im se pristupiti
izvana)

Class Pravougaonik { // ugniježdena klasa


public:
Pravougaonik (int, int, int, int);
//..
private:
class Tacka {
public:
Tacka (int, int);
private:
int x, y;
};
Tacka goreLijevo, doleDesno;
};

3. Lokalne klase – definisane u području neke funkcije ili bloka

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

1. Poziva se konstruktor za goreLijevo


2. Poziva se konstruktor za doleDesno
3. Poziva se konstruktor za Pravougaonik

67
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase

Pointeri na članove podatke

class Tacka {
public:
int xKoor, yKoor;
void defTac (int, int);
void pomTac (int, int);
};

Pointer na cjelobrojni član klase Tacka ima tip (pointer pokazuje na


cjelobrojni član, a član pripada klasi Tacka):
int Tacka::* int Tacka::*pKoor;

int *pClan = &Tacka::xKoor; // neispravno

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!!!

int Tacka::*pKoor = &Tacka::xKoor; // ispravno

Class Elipsa{
public:
int cx,cy,velikaPoluosa;
double ekscentricitet;
};
Class Linija{/*................*/}
// ................

int Elipsa ::*pNaCijeli=&Elipsa::ekscentricitet; // neispravno


int Linija::*pNaClanLinije = & Elipsa::cx; // neispravno
double Elipsa::*pNaClanElipse = &Elipsa::ekscentricitet; // ispravno

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;

//pristup preko ->*


pLinija->*pCijeli = 9;
Dev C++ – pointerPod.cpp
} Dev C++ – pointerOdrezi.cpp

70
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase

Pointeri na članove funkcije

class GrafObjekat{
// .......
public:
void Crtaj();
int Gore();
int Dole();
int Lijevo();
int Desno();
void PostaviVelicinu(int sirina, int visina);

// funkcija PonoviPomak ima parametar smjer koji je tipa pointer


// na član metodu klase GrafObjekat, nema parametera i vraća clijeli broj
void PonoviPomak(int (GrafObjekat::*smjer)(),int puta);
};
Deklaracija: navede se tip povratne vrijednosti, klasa funcije
int (GrafObjekat::*pNaFClan)();
i njeni parametri (u zagradama)!

71
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase

Pointer na član sa dva parametra bez povratne


void (GrafObjekat::*pNaDrugiClan)(int,int);
vrijednosti!!!

Pointer metode odgovara adresi bilo koje metode klase GrafObjekat koja kao argumente uzima
dva pointera na cijeli broj, a nema povratne vrijednosti.

Ime klase se mora navesti u tipu funkcijskog pointera!!!

Dodjeljivanje vrijednosti pointeru

?
pNaFClan = GrafObjekat::Gore; pNaFClan = &GrafObjekat::Gore;

72
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
Nakon toga slijede parametri fukcijskog člana.

GrafObjekat grObj, *pNaGrObj = &grObj;

// uzimanje adrese funkcijskog clana


int (GrafObjekat::*bezparam)()=GrafObjekat::Gore;

// poziv funkcijskog clana preko pointera


(grObj.*bezparam)();

73
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase

void (GrafObjekat::*dvaparam)(int,int);
dvaparam = GrafObjekat::PostaviVelicinu;

// poziv preko pointera


(pNaGrObj->*dvaparam)(5,6);

Dev C++ – pointerFunk.cpp


74
OOP I www.pf.unze.ba/OOPI
Klase (razredi, eng. classes)
Pointeri na članove klase

Treba paziti na prioritet izvođenja: operator () ima veći prioritet izvođenja, pa se


grObj.*bezparam stavlja u zagrade!!!

(grObj.*bezparam)();

Pointer na član se pretvori u pointer na funkciju


a zatim se primijeni operator za poziv

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

bezparam = GrafObjekat::Gore; //OK!!!


bezparam = GrafObjekat::Lijevo; //OK!!!

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)

Strukture su klase kod kojih podrazumijeva da su svi članovi javni ( public)


Definicija strukture počinje kljčnom riječju struct

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

You might also like