op p8 uvoduc
TRANSCRIPT
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
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)
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;
}
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
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
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
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 ;
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
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)
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
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);
}
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)
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
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”
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)
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
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);
};
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
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)
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();
};
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;
};
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
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
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--;
}
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