op p8 uvoduc
TRANSCRIPT
![Page 1: Op p8 Uvoduc](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022052503/544dd386b1af9f33638b49ba/html5/thumbnails/25.jpg)
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