op p8 uvoduc

25
1 Osnove programiranja Predavanje br. 8 Uvod u C++ akademska godina 2011/2012 v.pred.mr.sc. Oliver Jukić [email protected] http://tkojetko.irb.hr/znanstvenikDetalji.php?sifznan=9369 v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 2 Klase i objekti Elementi programiranja koje smo do sada koristili, ne razlikuju se bitno od bilo kojeg drugog proceduralnog programskog jezika Primjer: for petlju poznajemo još iz Basica FYI: Proceduralni jezik: opisuje se procedura koja govori kako riješiti problem, a ne što je problem (odnosno njegovo rješenje) – C, Pascal, Basic, Fortran Deklarativni jezik: opisuje se što je rješenje problema, a ne kako doći do njega - PROLOG

Upload: ella-kastullo

Post on 27-Oct-2014

47 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Op p8 Uvoduc

1

Osnove programiranja

Predavanje br. 8Uvod u C++akademska godina 2011/2012v.pred.mr.sc. Oliver Jukić[email protected]://tkojetko.irb.hr/znanstvenikDetalji.php?sifznan=9369

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 2

Klase i objekti

� Elementi programiranja koje smo do sada koristili, ne razlikuju se bitno od bilo kojeg drugog proceduralnog programskog jezika

� Primjer: for petlju poznajemo još iz Basica

� FYI:� Proceduralni jezik: opisuje se procedura koja govori

kako riješiti problem, a ne što je problem (odnosno njegovo rješenje) – C, Pascal, Basic, Fortran

� Deklarativni jezik: opisuje se što je rješenje problema, a ne kako doći do njega - PROLOG

Page 2: Op p8 Uvoduc

2

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 3

Klase i objekti

� Specifičnost C++ je tzv. objektno-orijentirani pristup

� To znači definiranje novih korisničkih tipova podataka, takozvanih klasa (eng. class)

� Razmatranja koja su nas dovela do uporabe struktura vrijede i ovdje

� Klasa znači određeno proširenje struktura podataka

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 4

Klase i objekti

� Programski objekt (eng. object) je naziv za skup svojstava koja možemo objediniti u smislenu cjelinu

� Pravila koja opisuju od čega je objekt sagrađen te kakva su njegova svojstva nazivaju se klasama

� Klasa je samo opis� Objekt je stvarna, konkretna realizacija

napravljena na temelju opisa (klase)

Page 3: Op p8 Uvoduc

3

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 5

Klase i objekti

� Ideja uvođenja objekata u programiranje je revolucionarna, ali je ipak samo posljedica analiziranja načina na koji funkcionira stvarni svijet

� S obzirom da programi rješavaju probleme stvarnog svijeta, pristup je prepoznat od strane mnogih programera

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 6

Klase i objektiObjekti iz stvarnog svijeta

Klasa Automobil

Svojstva objekata koji logički pripadaju klasi:

� snaga motora� broj vrata� zapremina� najveća brzina� boja� ....

Objekti klase Automobil u programskom kodu:

int main()

{

int i;

float f;

Automobil kristina;

Automobil susjedov_stojadin;

Autobomil mali_div;

....

if(kristina.boja==BOJA_CRVENA)

{

printf(“Imamo horror\n”);

}

return 0;

}

Page 4: Op p8 Uvoduc

4

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 7

Klase i objekti

� Klasom su u logičku cjelinu zatvorena i opisana svojstva koja karakteriziraju neku skupinu istovrsnih objekata iz stvarnog svijeta (npr. automobil)

� U programskom kodu moguće je na osnovu opisa (klase) kreirati (instancirati) objekte u programskom kodu, koje onda koristimo da nam prezentiraju objekte iz stvarnog svijeta u našim programima

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 8

Klase i objekti

� Analogija sa strukturama:� Kod deklaracije strukture smo u stvari kreirali

jedan novi tip varijable, koji smo kasnije mogli koristiti u programskom kôdu

� Slično je i sa klasom: njome definiramo novi tip podatka, koji u kôdu instanciramo u objekt –jednostavnom deklaracijom varijable koja time postaje objekt određene klase

Page 5: Op p8 Uvoduc

5

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 9

Klase i objekti

� Za razliku od strukture koju čine samo podatkovni članovi, unutar klase moguće je definirati i funkcijske članove

� To je bitno proširenje koncepta strukture podataka, a ujedno predstavlja osnovu objektno-orijentiranog načina razmišljanja: u objektu nemamo samo podatke, već i sve bitne procedure za rad s podacima (objektom)

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 10

Klase i objekti

� Okolina ne mora znati ništa o unutarnjem ustrojstvu objekta – on samo interagira sa okolinom, odnosno drugim objektima

� Suradnju objekta sa okolinom definira tzv. javno sučelje (eng. public interface), o kojem će biti više riječi u nastavku predavanja

� Implementacija objekta govori o tome kako je objekt realiziran

Page 6: Op p8 Uvoduc

6

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 11

Klase i objekti

Primjer:

� svaki automobil ima svoje javno sučelje koje čine:� volan� mjenjač� papučice� komandna ploča (kontrola svjetala,

pokazivača smjera,....)� .....

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 12

Klase i objekti

� Unutarnja struktura automobila je većini vozača nepoznata

� Oni “komuniciraju” s automobilom putem javnog sučelja

� Bitno im je da se tražena funkcija izvrši, a ne zanima ih kako je izvršena u untarnjoj strukturi autobomila

Page 7: Op p8 Uvoduc

7

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 13

Klase i objekti

� Svojstvo koje objedinjuje javno sučelje i njegovu implementaciju, skupa sa podacima, naziva se enkapsulacija (eng. encapsulation)

� Kada je klasa jednom definirana, pomoću nje možemo kreirati (instancirati) po volji velik broj objekata

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 14

Deklaracija klase

� C++ klasu možemo shvatiti kao poseban tip podataka koji je prije korištenja potrebno deklarirati

� Deklaracija klase sastoji se od dva osnovna dijela: zaglavlja i tijela

� Zaglavlje se sastoji od ključne riječi classiza koje slijedi naziv klase, a tijelo slijedi iza zaglavlja i omeđeno je parom { }, koji završava znakom ;

Page 8: Op p8 Uvoduc

8

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 15

Deklaracija klase

class naziv_klase //zaglavlje

{

//tijelo klase

};

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 16

Deklaracija klase

� Naziv klase mora biti jedinstven, on predstavlja u stvari naziv novokreiranog tipa varijabli

� Unutar deklaracije klase razlikujemo podatkovne i funkcijske članove

Page 9: Op p8 Uvoduc

9

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 17

Podatkovni članovi

� Svaka klasa može sadržavati podatkovne članove

� Primjer klase koja može biti dio grafičkog sučelja:

class Prozor

{

int nX1,nY1,nX2,nY2;

char *naziv;

Prozor *vlasnik;

};

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 18

Podatkovni članovi

� Ukoliko promatramo samo podatkovne članove, nema razlike između klase i strukture

� Unutar klase ne može postojati statički deklariran objekt istog tipa koji ta klasa definira, ali može postojati pokazivač na takav objekt (prisjetiti se pNext kod vezanih lista)

Page 10: Op p8 Uvoduc

10

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 19

Dohvaćanje podatkovnih članova

� Dohvaćanje podatkovnih članova isto je kao i dohvaćanje članova strukture:

Prozor prozor;

Prozor *p = &prozor;

prozor.nX1 = 100;

p->nX1 = 100;

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 20

Funkcijski članovi

� Razliku između klase i obične strukture podataka čine funkcijski članovi klase

� Funkcijski članovi definiraju skup operacija koje se mogu obaviti na objektu

� Svaka klasa može unutar sebe imati deklarirano više funkcija, koje predstavljaju njene funkcijske članove

Page 11: Op p8 Uvoduc

11

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 21

Funkcijski članovi

� Primjer klase koja može biti dio grafičkog sučelja, sa funkcijskim članovima:

class Prozor

{

int nX1,nY1,nX2,nY2;

char *naziv;

Prozor *vlasnik;

void Sakrij();

void Prikazi();

};

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 22

Pristup funkcijskim članovima

� Pristup funkcijskim članovima sličan je dohvaćanju podatkovnih članova:

Prozor prozor;

Prozor *p = &prozor;

while(1)

{

prozor.Prikazi();

Sleep(1000);

p->Sakrij();

Sleep(1000);

}

Page 12: Op p8 Uvoduc

12

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 23

Implementacija funkcijskih članova

� Implementacija funkcijskih članova je u stvari definicija funkcija koje pripadaju klasi

� Ista je kao i definicija obične funkcije, s tim da se ispred imena funkcije nalazi ime klase kojoj funkcija pripada praćeno znakom ::

� Primjer:void Prozor::Sakrij()

{

//naredbe koje sakrivaju objekt

//(prozor)

}

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 24

Prava pristupa

� Određenim članovima mogu se pridjeliti različita prava pristupa, koja se odnose na pozivanje i dohvat tih članova

� Prava pristupa su:� private (privatno)

� public (javno)

� protected (zaštićeno)

Page 13: Op p8 Uvoduc

13

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 25

Prava pristupa

� Prava pristupa dodjeljuju se na način da se ispiše ključna riječ public, private iliprotected iza koje dolazi znak :

� Sve varijable i funkcije nakon tog retka imaju definirana prava pristupa

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 26

Javni pristup

� Članovima koji imaju javni pristup može se pristupiti izvan klase bez ograničenja

� Za sada zanemarimo ostale načine pristupa, koristit ćemo samo ovaj

� Ukoliko se ne navede niti jedan način pristupa, uzet će se onaj koji je podrazumijevani (default) a to je private

� Stoga se javno pravo pristupa mora posebno naglasiti

Page 14: Op p8 Uvoduc

14

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 27

Javni pristup

Primjer deklaracije prava pristupa:class Brojeni()

{

public:

Brojeni();

~Brojeni();

void PokreniSlijedTestova();

private:

static int Brojac;

void Test1();

void Test2();

void Test3();

};

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 28

Javno sučelje

� Javno sučelje neke klase predstavljaju podatkovni i funkcijski članovi koji su deklarirani sa javnim pravima pristupa, kao public

� Tim članovima se može neograničeno pristupati izvan objekta – jedino su oni “vidljivi” ako gledamo objekt “izvana”

Page 15: Op p8 Uvoduc

15

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 29

Životni vijek objekta

� Kreiranje objekta naziva se konstrukcija (eng. construction), a njegovo uništavanje naziva se destrukcija (eng. destruction)

� Termin “uništavanje” ne treba shvaćati dramatično: ako je objekt deklariran unutar bloka naredbi, on po izlasku iz tog bloka više ne postoji, dakle uništava se – slično kao i lokalno deklarirane varijable bilo kojeg tipa

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 30

Životni vijek objekta

� Posebna funkcija poziva se automatski prilikom kreiranja objekta i naziva se konstruktor (eng. constructor)

� Posebna funkcija poziva se automatski kod uništavanja objekta i naziva se destruktor (eng. destructor)

Page 16: Op p8 Uvoduc

16

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 31

Konstruktor

� Kada se stvori novi objekt neke klase, njegovi članovi su neinicijalizirani – biti će im pridjeljena vrijednost koja se slučajno našla na tom memorijskom prostoru

� Stohastički postavljena vrijednost podatkovnih članova potencijalno je vrlo opasna

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 32

Konstruktor

� C++ nudi elegantno rješenje: Svaka klasa može imati konstruktor, poseban funkcijski član koji se automatski poziva prilikom stvaranja objekta

� Konstruktor se deklarira kao funkcijski član koji nema povratnu vrijednost (nije niti void) i imena je identičnog imenu klase

Page 17: Op p8 Uvoduc

17

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 33

Konstruktor

� Klasa može imati i više konstruktora, koji su istog tipa i imena, ali imaju različitu listu argumenata

� Koji konstruktor će se izvršiti prilikom kreiranja objekta, ovisi o načinu deklariranja objekta neke klase u programskom kôdu

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 34

Konstruktor

� Primjer deklaracije klase sa dva konstruktora:class Prozor

{

public:

//Konstruktor #1

Prozor();

//Konstruktor #2

Prozor(Prozor *vlasnik);

};

Page 18: Op p8 Uvoduc

18

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 35

Konstruktor

� Različite deklaracije pozivaju različite konstruktore

//Konstruktor prvog objekta

Prozor prozor1; //deklaracija bez

//zagrada!

//Konstruktor drugog objekta

Prozor prozor2(&prozor1);

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 36

Konstruktor

� Tipična uporaba konstruktora:� inicijalizacija članova� dinamička alokacija potrebne memorije� čitanje podataka iz konfiguracijske datoteke ili baze

podataka� ....

� Konstruktor bez parametara naziva se podrazumijevani konstruktor

� Njega će kreirati prevoditelj, ako klasa nema deklariran i definiran niti jedan konstruktor

Page 19: Op p8 Uvoduc

19

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 37

Destruktor

� Kada objekt više nije potreban, on se uklanja iz memorije

� To se može napraviti statički ili dinamički� Princip je isti kao i sa

statičkom/dinamičkom dealokacijom memorije

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 38

Destruktor

� Prilikom uklanjanja objekta iz memorije automatski se poziva destruktor, koji je zadužen za oslobađanje svih resursa koje je objekt zauzeo

� Kao i konstruktor, niti destruktor nema povratni tip (nije niti void)

� Ime mu je isto kao i ime klase, ali ispred njega stoji znak ~ (tilda)

Page 20: Op p8 Uvoduc

20

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 39

Destruktor

� Destruktor se poziva u sljedećim situacijama:� za statički alocirane objekte na kraju bloka u

kojem je objekt deklariran� za dinamički kreirane objekte prilikom

uništenja objekta operacijom delete

� za globalne objekte na kraju funkcije main()

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 40

Destruktor

� Primjer deklaracije destruktora:class Prozor

{

public:

//Konstruktor

Prozor();

//Destruktor

~Prozor();

};

Page 21: Op p8 Uvoduc

21

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 41

Destruktor

� Destruktor ne može biti deklariran s argumentima, pa tako možemo imati samo jedan destruktor u klasi (osim u specijalnim slučajevima koji u ovom trenutku nisu bitni)

� Kao i konstruktor, destruktor ne mora biti deklariran – u tom slučaju opet će prevoditelj kreirati podrazumijevani destruktor

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 42

Destruktor

� Deklarirajmo listu sa prethodnih predavanja kao klasu (samo dodamo konstruktor i destruktor podatkovnim članovima):class Student

{

public:

Student();

~Student();

private:

char *ime;

//... ostali podatkovni članovi

Student *pNext;

};

Page 22: Op p8 Uvoduc

22

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 43

Destruktor

� Implementirajmo destruktorStudent::~Student()

{

if(pNext) delete pNext;

}

� Brisanje liste ne treba dodatne algoritme, dovoljno je samo u kôdu napisati:

delete glb_pHead

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 44

Destruktor

� Što će se dogoditi:� Brisanjem prvog člana (head pointer) poziva

se njegov destruktor, koji odmah inicira uništavanje sljedećeg člana

� Kod uništavanja sljedećeg člana zove se njegov destruktor, koji uništava njegov sljedeći član itd. sve dok se ne dođe do kraja liste (kada je pNext == 0 NULL)

� Dolazi do domino-efekta koji elegantno briše cijelu listu

Page 23: Op p8 Uvoduc

23

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 45

Statički članovi klase

� Ponekad postoji potreba da se neki podaci dijele između svih objekata iste klase

� To se može ostvariti statičkim članovima� Statički mogu biti podatkovni i funkcijski članovi

� Tipičan primjer je brojač koji broji koliko je ukupno objekata neke klase kreirano u programu

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 46

Statički članovi klase

� Potencijalna primjena:program koji služi za nadzor IP mreže računala, rutera i ostale mrežne opreme (npr. Hewlett-Packard Open View Network Node Manager).

Svaka komponenta u mreži naziva se mrežni čvor (eng. network node). Programska licenca se prodaje po broju mrežnih čvorova koje u istom trenutku program može nadzirati, te je u programu potrebno voditi računa o tome da broj ne prijeđe određenu vrijednost, koja je plaćena.

Svaki mrežni čvor je implementiran kao jedan objekt u programu

Page 24: Op p8 Uvoduc

24

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 47

Statički članovi klase

� Primjer deklaracije statičkog člana:#define MAX_NODES 100

class NetworkNode()

{

static int NodeCount;

NetworkNode();

~ NetworkNode();

};

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 48

Statički članovi klase

� Primjer korištenja statičkog člana:NetworkNode::NetworkNode(){

NodeCount++;

if(NodeCount > MAX_NODES)

{

//Please extend your licence!

}

}

NetworkNode::~NetworkNode(){

NodeCount--;

}

Page 25: Op p8 Uvoduc

25

v.pred.mr.sc. Oliver Jukić: Osnove programiranja – P8 – 49

Ključna riječ this

� Svaki objekt ima skriveni pokazivač na samog sebe, koji se naziva this

� this ne može biti deklariran kao član klase, on se podrazumijeva