You are on page 1of 45

Programiranje II

Uvod

Softver Obini korisnik

Porast procesorske moi raunara i pojeftinjenje


komponenti omoguili su da niskobudetni korisnici
mogu da priute sebi raunare za posao i zabavu.
Softveri za obine korisnike morali su da budu pisani
na osnovu strategije odbrambenog programiranja
(trebalo je predvidjeti korektivnu akciju za svaku
glupost koji ovi korisnici pokuaju) i morali su da se
izvravaju interaktivno (na osnovu nekih intuitivnih
predstava), jer se ovi korisnici nijesu mogli natjerati da
pamte naredbe ili sloene procedure (ili nijesu htjeli da
plate za takve softvere).
Da stvar bude gora, obini korisnici su, kada su shvatili
mo raunarskih sistema, poeli da postavljaju sve
vee i vee zahtjeve.

Softver Proizvoa
softvera

Da bi proizvoa softvera zaradio mora da izae u


susret zahtjevima korisnika (u suprotnom, preotee
mu ih drugi proizvoa).
To znai da su softverske firme morale da brzo
proizvode nove verzije softvera.
Brzo - iz dva razloga: da bi to prije izale u susret
korisnikim zahtjevima i da bi to manje platile
programere (na zapadu programeri rade po satnici).
Kako su softveri bivali sve komplikovaniji i
komplikovaniji to su nove verzije morale polaziti od
koda stare verzije i na osnovu prepravki se dolazilo
do nove verzije.

Softver - Sadraj

Programski moduli koji su sainjavali softvere


su prevashodno bile funkcije.
Podaci nad kojima su funkcije operisale bili su
po pravilu strukture (samo struktura moe da
predstavi sloeniji podatak: radnika, studenta,
prozor u grafikom okruenju, grafik itd.).
Svaka funkcija koja je radila sa strukturama
morala je da zna na koji je nain struktura
napravljena (od ega se sastoji).
E tu lei zec...

Softver - Prepravke

Prepravke softvera su bile komforne dok se prepravljaju


funkcije, ali kada se prepravi jedna struktura to je znailo
da se moraju prepraviti sve funkcije koje komuniciraju sa
tom strukturom, tj. koje je koriste.
Svaka prepravka funkcije se morala testirati.
Najvei problem je to to prepravka strukture dovodi do
nelokalizovanih prepravki programa, odnosno
najvjerovatnije indukuje prepravku kompletnog
programa!
Jedna prepravka indukuje mnotvo drugih prepravki, a
svaka prepravka znai mnogo testiranja.
Programeri su svoje korisno vrijeme troili ne na pisanje
programa, ve na njihovo testiranje!!!

Softverska kriza

Da bi zaradile, softverske kue su na trite


iznosile programe koji nijesu bili dovoljno testirani
i ti programi su imali mnogo greaka (bugs). Kupci
nijesu eljeli da kupuju takve softvere ili su traili
povraaj uloenog novca.
Mnotvo softverskih firmi je propalo.
Postalo je jasno da uskoro nijedna firma nee moi
da proizvede iole ispravan softver za dato vrijeme.
Ovaj dogaaj se naziva softverskom krizom.
Krajem 80-tih jedna grupa programera na elu sa
Bjarne Stroustrupom dobila je zadatak da prepravi
softver za telefonsku centralu.

Rjeenje softverske krize

Grupa je radila za AT&T Bell.


Stroustrup je uoio da zadatak prepravke softvera (pisan u Cu, kao i 90% sistemskog softvera tada) nije mogue obaviti u datom
vremenu, na datom kompajleru i sa datim ljudstvom.
Stoga je potraio nove koncepte na kojima bi se softver
mogao realizovati.
Tada su ve postojali (vie od 10 godina) objektno-orjentisani
(OO) jezici (primjer je Smalltalk), ali nijesu bili popularni zbog
sloenosti.
Stroustrup je doao na spasonosnu ideju: nakalemiti OO
koncepte na postojei (C) kompajler. Dobio je kombinaciju
jednostavnosti i moi alatke kojom je rijeio svoj problem
(piui novi kompajler), ali i itavu softversku krizu.

OOP (programiranje) Koncepti

Stroustrup je postigao da OOP nije zamjena za


strukturno programiranje, ve njegovo proirenje.
Tokom vremena emo nauiti da je ovo proirenje
ogromno i da zasjenjuje mnogo toga to smo do sada
uili. Ovdje emo pomenuti samo osnovne koncepte
OOP koje emo na primjeru programskog jezika C++
uiti do kraja kursa.
Enkapsulacija. Ovo je najvaniji OO koncept. Ovaj
koncept omoguava da se nain realizacije djelova
koda (zapravo, korisnikih tipova podataka) sakrije od
korisnika (u kapsulu koja se naziva klasa). Prepravke
unutar klase nemaju uticaj na ostatak koda, jer ostatak
koda nije nikada znao kako je klasa bila realizovana.
Na ovaj nain, prepravljanje koda je lokalizovano, ime
se podrava reusing (ponovno korienje) programa.

OOP - koncepti

Ponekad se kae da su u programiranju najvanije tri


stvari: reusing, reusing i reusing, odnosno mogunost
ponovnog korienja koda.

Apstrakcija. Ovo je prvi koncept po svojoj


logici. Apstrakcija je modelovanje dijela
problema razmatranjem odgovarajueg tipa
podataka. Npr. ako je program vezan za rad
studentske slube, Student je dio problema i taj
problem treba rijeiti modelovanjem Studenta.
Taj model se kreira kao tip podataka (klasa),
odnosno tip podataka nam je dio rjeenja
problema. Ovo je jedan od elemenata OOP
veliki dio problema se rjeava u okviru modela
podataka.

OOP Koncepti

Nasljeivanje. Kreirali smo jednu klasu, recimo


-Student. Meutim, sistem posjeduje i podatke tipa
Diplomac koji su razliiti unekoliko od ove klase.
Jedan nain rjeavanja problema je da realizujemo
dvije klase sa gotovo istim operacijama koje se sa
njima mogu vriti. Ovo je loe, jer, ako je bilo koja
operacija loe realizovana, mi prepravke moramo
obaviti na vie mjesta u kodu, ime se gube neke
dobre strane OOP, a to je lokalizovano
prepravljanje greaka. Umjesto toga, mi moemo
rei da klasa Diplomac (naziva se izvedenom
klasom) nasljeuje sve iz klase Student (naziva se
osnovnom klasom) uz neke dopune i izmjene.

OOP Koncepti

Prijateljstvo. Vie klasa moe da radi na rjeavanju


istog problema. Ponekad postoji potreba da one na
neki nain razmjenjuju podatke. Da bi se izbjeglo
ugroavanje enkapsulacije (odnosno situacija da klasa svima
dozvoli uvid u svoju realizaciju), uvodi se koncept
prijateljstva po kome klasa samo odreenim klasama
(i funkcijama) moe dozvoliti pristup svojoj realizaciji.
Preklapanje operatora. OOP i C++ dozvoljavaju
da se znaenje standardnih operatora predefinie za
klasne tipove podataka. Nema potrebe da
naglaavamo koliko je pogodnije i prihvatljivije
zapisati sabiranje vektora kao a+b nego preko
uvoenja funkcije koja bi obavila ovo sabiranje.

OOP Koncepti

Polimorfizam. Ovo je jedan od najsloenijih (i


najmonijih) koncepata OOP. Jedan dio koda u OOP
moe da se ponaa razliito u zavisnosti od toga na
kakve se podatke primjenjuje. Koncept je sloen i
realizuje se preko: preklapanja funkcija, nasljeivanja
(posebno koncepta virtuelnih funkcija) i preko ablona
klasa i funkcija. Koncept emo detaljno razmatrati kad
za to doe vrijeme.
Izuzeci. U programiranju, izuzetak je dogaaj koji se
moe predvidjeti, a ne moe izbjei (nema papira,
djeljenje sa nulom, itd.). OOP i C++ dozvoljavaju
obradu izuzetaka tako to definiu mogunost
postojanja programske preice izmeu mjesta gdje
nastaje izuzetak i mjesta gdje se on obrauje.

Organizacija kursa

Nakon ovog kratkog uvoda, prelazimo na


izuavanje koncepata koje je C++ dodao na
programski jezik C, a koji nijesu strogo objektne
prirode.
Nakon toga uimo koncepte OOP u programskom
jeziku C++.
Raunske vjebe prate predavanja, dok
laboratorijske vjebe prate predavanja djelimino
(odnosno tamo se naglasak stavlja na korienje
jednog savremenog vizuelnog programskog
alata).

Razlike C i C++ neobjektne


prirode

Gornji naslov nije ba najprecizniji jer emo uvesti i


neke objektne koncepte koje tako neemo predstaviti.
C++ posjeduje sve kljune rijei C-a.
Moe se shvatiti kao proireni ili poboljani C.
Svaki ispravno napisan C program moe se kompajlirati
na svakom C++ kompajleru.
Prva razlika koju uvodimo je kod deklaracije
promjenljivih. C++ doivljava programsku petlju kao
ispravan poetak bloka naredbi, tako da je dozvoljeno
deklarisati promjenljivu u programskoj petlji, npr.:
for(int i=0;i<100;i++) /*...*/
Napomena: Veina C++ kompajlera dozvoljava deklaraciju promjenljive
bilo gdje u bloku naredbi prije prve upotrebe promjenljive (ne ekskluzivno
na vrhu kao u C-u) ali ne treba zloupotrebljavati ovu mogunost.

Razlike kod funkcija

Neobjektne razlike C-a i C++ su najvee u dijelu prie


o funkcijama.
Postoje tri dodatka koja ine funkcije u C++ fleksibilnijim
i na neki nain boljim od onih u C-u:

Inline funkcije;
Podrazumijevani argumenti;
Preklapanje funkcija (function overloading).

Vidjeli smo da u izvravanju programa uestvuju:


alokacioni zapis (koji uva podatke o tekuoj aktivaciji dijelu koda
koji se trenutno izvrava) i stek (na kom se nalaze podaci o aktivacijama
koje su pozvale aktivni dio koda).
Snimanje podataka na stek i preuzimanje podataka sa
steka traje neko vrijeme koje moe da bude due od
vremena izvravanja jednostavnih funkcija.

Inline funkcije

Da bi se izbjeglo gubljenje vremena na izvravanje


kratkih funkcija, u C++ je uveden koncept inline
funkcije (funkcije ugraene direktno u kod programa):
inline int zbir(int a, int b) {return a+b;}
Prethodni primjer predstavlja zaista jednu kratku
funkciju iji bi poziv (i povratak iz funkcije) odnio vie
vremena nego izvravanje. Stoga je dodata kljuna
rije inline koja znai da se umjesto poziva funkcije
vri postavljanje koda funkcija na svakom mjestu gdje
se funkcija poziva. Ovo dovodi do breg izvravanja, ali
neto vee EXE verzije programa. Da se EXE verzija ne
bi nepotrebno uveavala, kao inline se deklariu samo
relativno kratke funkcije.

Poboljanja kod funkcija

Ako kompajler iz nekog razloga ne moe da kreira


inline funkciju, odnosno da je ugradi u kod, kreirae je
kao standardnu funkciju. Ostala pravila kod inline
funkcija su ista kao i kod standardnih funkcija.
Drugi vaan koncept uveden kod funkcija u C++, a koji
ne postoji u C-u, su podrazumijevani argumenti.
Pretpostavimo jednostavan program koji treba da
rauna teinu tijela na osnovu njegove mase:
float tezina(float masa) {return 9.81*masa;}
To e dobro raditi u naoj zemlji, ali to ako nam se
desi da ponekad proraun vrimo za neku drugu
lokaciju (recimo, Meksiko Siti gdje je gravitaciono
ubrzanje manje ili za neki trei grad)?

Podrazumijevani argumenti
f-ja
Prethodni problem se moe rijeiti pisanjem
mnotva funkcija gdje bi svaka radila sa svojim g
ili pisanjem jedne funkcije koja bi imala dva
argumenta - masa i g. Drugi nain je bolji, ali ne i
idealan, jer bi stalno funkciju pozivali kao
tezina(m, 9.81), odnosno u veini sluajeva se
nepotrebno zamarali sa pisanjem 9.81 koje je
uobiajeno.
C++ dozvoljava sljedei oblik f-je:
float tezina(float masa, float g=9.81)
{return
Podrazumijevani
Poziv
f-je: tezina(m) vraa
g*masa;}
(default) argument.

m*9.81, a ako se pozove


tezina(m,g) vraa m*g.

Default argumenti - Pravila

Dakle, ako se izostavi podrazumijevani argument


onda se uzima podrazumijevana vrijednost iz
zaglavlja f-je.
Funkcija moe imati vie podrazumijevanih
argumenata, ali svi moraju biti na kraju. Npr.
int fun(int a, int b=2, int c=3) {return a+b*c;}
Poziv fun(x) se tretira kao fun(x,2,3), a poziv
fun(x,y) se tretira kao fun(x,y,3).
Najvee unaprijeenje u pogledu f-ja C++ je
ostvario preklapanjem (eng. overloading)
imena funkcija.

Preklapanje funkcija

Mnoge funkcije rade prirodno sline stvari. Recimo,


maksimum dva cijela broja je slina funkcija kao
maksimum dva realna broja, a ova je slina kao
maksimum niza realnih brojeva.
U programskom jeziku C smo realizovali funkcije po
pravilu jedan problem - jedna funkcija, odnosno (to je
gora formulacija) vie slinih problema - vie slinih
funkcija.
C++ nam dozvoljava da vie funkcija koje rade sline
stvari nazovemo istim imenom. Taj koncept se naziva
preklapanje imena funkcija function overloading.
Koja od preklopljenih funkcija e se izvriti zavisi od
argumenata sa kojima je pozvana.

Preklapanje imena f-ja Primjer

Kreirajmo tri preklopljene f-je:


int max(int a, int b) {return (a>b)?a:b;}
Tip podatka
float max(float a, float b){return (a>b)?a:b;}
se
float max(float *a, int n) {float max=a[0]; float
mnogo manje
for(int i=1;i<n;i++) if(a[i]>max) max=a[i];koristi u C++
u odnosu na
return max;}
double.
Poziv max(3,5) poziva prvu funkciju jer postoji
potpuno slaganje argumenta, max(2.4,3.1)
poziva drugu, dok kod:
float x[50]; int n; /*...neke naredbe...*/
max(x,n); poziva treu.

Razrjeenje poziva

Prethodni primjer je demonstrirao situaciju kada postoji potpuno


poklapanje argumenata pozvane funkcije sa pojedinim njenim
realizacijama.
Postoji problem to se deava ako takvog poklapanja nema.
Procedura koja se provodi i koja odluuje koja se funkcija zapravo
poziva naziva se razrjeenje poziva.
Grubo pravilo: za svaku funkciju datog imena broji se koliko ima
potpunih preklapanja sa tipovima zadatih argumenata. Ako
postoji jedna funkcija koja ima najvie preklapanja poziva se ona,
a ako ima vie od jedne sa najveim brojem preklapanja
provjerava se koja od njih ima najvei broj preostalih argumenata
koji se konverzijama mogu prevesti u traene argumente. Ako se
nae jedna funkcija - poziva se ona, a ako ima vie od jedne sa
podjednako kvalitetnim argumentima dolazi do prekida
izvravanja programa i greke usljed dvosmislenosti.

Razrjeenje poziva

Npr. poziv max(2,2.5) e dovesti do greke poto dvije funkcije


imaju po jedno potpuno poklapanje argumenta i jedno koje se
standardnim konverzijama moe izvriti.
Razrjeenje poziva se dodatno komplikuje ako imamo funkcije
sa podrazumijevanim argumentima.
Postupak razrjeenja poziva je detaljno analiziran u knjizi od
Milieva na stranama 199-203.
Mi emo to ovdje preskoiti.
Problem postaje dodatno uslonjen ako kompajler ne prati
preporuke ANSI komiteta. Npr. na kompajler e prilikom
poziva max(2,2.5) pozvati funkciju koja prima dva float-a jer to
doivljava kao bolju situaciju u kojoj ne dolazi do odsjecanja
necjelobrojnog dijela prilikom prenosa argumenta.

Razrjeenje poziva - Savjet

Najbolje je da do pomenutih problema u razrjeenju


poziva i ne doe.
Naime, ako veoma sline funkcije realizujemo kao to
smo to uradili sa prve dvije, mi obije operacije
moemo odraditi sa drugom funkcijom koja sa
standardnom konverzijom moe da primi i argumente
koji su cijeli brojevi i da, ako su argumenti cijeli
brojevi, vrati rezultat koji je sutinski cijeli broj. Stoga
bi u naem sistemu izbrisali prvu funkciju i ne bi imali
problem sa razrjeenjem.
Briljivim dizajnom funkcija izbjeiete problem
tumaenja razrjeenja poziva funkcija.

Razrjeenje poziva

Ako funkcije imaju iste argumente, a razliit tip rezultata, doi e


uvijek do greke u kompajliranju (ili greke u izvravanju) poto se te dvije
funkcije ne mogu razdvojiti argumentima i nikada se ne moe
protumaiti koja e se pozvati!!!
Funkcije sa istim imenima moraju se razlikovati barem po jednom
argumentu!!!
U C-u smo vidjeli da ime funkcije moe posluiti kao njena adresa. To
nije bio problem jer je funkcija morala da ima jedinstveno ime i to ime
je moglo da se upotrijebi kao pristupna adresa kodu funkcije.
U C++ vie funkcija moe da dijeli isto ime, pa se, recimo, njena
adresa mora specificirati i tipom argumenata. Ako je adresa funkcije
argument neke druge funkcije onda se mora slagati po tipu
pokazivaa (pokaziva na cjelobrojnu funkciju se ne moe implicitno
konvertovati u pokaziva na neku drugu funkciju) , a mora postojati i
jedinstvena identifikacija argumenata funkcije. Npr. zaglavlje funkcije
koja ima za argument drugu funkciju bi moglo biti: int fja(int (*max)
(int, int)).

Komentari i konstante

Pored komentara u C-u koji poinje sa /* i


zavrava sa */ i moe se prostirati preko vie
redova, C++ ima i komentar oblika // koji vai do
kraja reda.
Kod konstanti nema razlika u sintaksi: const int
i=1; predstavlja konstantu iji pokuaj promjene
dovodi do greke u izvravanju ili kompajliranju.
Pored toga, uveli smo ve konstantne pokazivae:
U prvoj varijanti p je pokaziva na konstantni
const int *p;
cijeli broj. U drugoj varijanti d je konstantni
int * const d;
pokaziva na cijeli broj (koji se moe
const int * const t; mijenjati). U treoj varijanti i t (pokaziva) i
broj na koji t pokazuje su konstantni. Memo
tehnika: ukinuti const i protumaiti
deklaraciju, vratiti const i pogledati to se

Konstante - Pretprocesor

Pa gdje se konstante razlikuju? U upotrebi! U C++


se mnogo vie koriste da bi se umanjila upotreba
pretprocesora. Ako je argument funkcije const
(obino se primjenjuje kod pokazivaa) onda ono na to taj
argument pokazuje (ili referencira, o emu emo kasnije)
ne moe biti promijenjeno u funkciji, tj. u sluaju
promjene dolazi do prekida izvrenja programa.
Kakve su razlike kod pretprocesora kod C-a i C+
+? Nikakve (ili gotovo nikakve). Razlika je samo u
upotrebi.
Osnovna razlika je da se znatno manje koristi
makro naredba #define.

Upotreba #define

Pretprocesorska direktiva #define u C-u je imala tri


namjene:

makrozamjena (npr. #define MAX 100, kojom se svaka pojava


MAX u kodu programa prije poetka kompajliranja mijenja sa
100. Problem je bila promjena na slijepo, jer se MAXMAX
mijenjalo sa 100100, kao i to to se na ovaj nain u izrazima
gdje se pojavljuje makro MAX ne moe vriti provjera
ispravnosti tipova. Umjesto ovoga koristiti globalnu konstantu:
const int MAX=100;).
makrorazvoj (npr. #define zbir(a,b) a+b koji je svako
pojavljivanje makroa zbir mijenjao sa odgovarajuim zbirom.
Ovo je bio model jednostavne funkcije koja se kompajlirala bez
provjere tipova i nosila je niz sitnih problema tipa zbir(x,y)/2
koje je mijenjano sa x+y/2. Umjesto ovoga koristiti inline
funkcije koje pored ostalog daju i kontrolu upotrebe tipova
podataka:
inline int zbir(int a, int b) {return a+b;}

Upotreba #define

Trea upotreba #define je preivjela:

makrodefinicija tipa #define _MAX. Na ovaj nain se u


program uvodi ime _MAX. Nije pravilo, ve praksa, da
imena makroa poinju sa podvlakom. Obino se navodi u
biblioteci klasa ili funkcija. Npr. napravimo biblioteku
klasa ili funkcija koja koristi prvu biblioteku. Zatim piemo
program koji ukljuuje obije biblioteke preko naredbe
#include. Programer koji koristi biblioteke ne mora da zna
kako su one kreirane. Meutim, poto su funkcije ili klase
prve biblioteke ukljuene i u drugu biblioteku dolo bi do
prekida programa jer imamo dva puta definisane funkcije
sa istim imenom i istim argumentima (ili dvije klase sa
istim nazivom), to nije dozvoljeno.

Korienje definisanih
makroa

Programi esto imaju pitanja tipa:


Ako makro _MAX nije definisan do
#ifndef _MAX
sada - ukljui biblioteku. Selekcije u
#include <bibl_sa_max.h>
ovom dijelu uvijek zavravaju sa
#endif.
#endif

Podsjetite se i drugih makroselekcija tipa #ifdef (ako je definisan


makro), #undef kojom neki makro prestaje da bude definisan
itd.

#define ima jo neke primjene koje mogu da se


koriste i u savremenim C kompajlerima, a
standardizovane su tek nakon pojave C++.
To su tzv. specijalni tipovi makrorazvoja.

Specijalni tipovi
makrorazvoja

Taraba zapravo znai da


se argument
makrorazvoja tretira
kao string.

Prvi specijalni tip makrorazvoja je:


#define napisistring(x) puts(#x)
U programu: napisistring(ssss) se mijenja sa
naredbom puts(ssss).
Drugi specijalni tip makrorazvoja je:
Argument makroa
#define abc(x) R##x##C
moe sluiti za
formiranje razliitih
Kao konani dodatak prii o
pretprocesoru kaimo da savremeni identifikatora,
recimo R1C, R2C
kompajleri dozvoljavaju i korienje odreenih
itd.
ugraenih makrokonstanti: _ _DATE_ _ (tekui
datum; da, u pravu ste, makrou prethodi i za njim
slijede dvije podvlake), _ _TIME_ _ (tekue vrijeme), _
_LINE_ _ (linija koda), _ _FILE_ _ (fajl koji se izvrava).

Stringovi

Programski jezik C++ dozvoljava neke neobine


operacije kod stringova. Npr. dozvoljeno je napisati
abc+123 to e rezultirati konkatenacijom
stringova abc123.
Pored toga, string se tretira kao pravi podatak, a
ne samo kao pokaziva na niz karaktera. Ovaj
detalj ipak ima dosta veze sa OO orjentacijom C+
+, ali o tome kasnije.
Mnogi kompajleri potiskuju korienje niza
karaktera kao tzv. stringa sa terminacionim
simbolom u korist klasa koje realizuju stringove, ali
to emo moi da obradimo kasnije u naem kursu.

Formatizovani I/O

C i C++ imaju osobinu da ulaz/izlaz nijesu sastavni dio


definicije programskog jezika.
U C-u smo intenzivno koristili stdio.h biblioteku sa
naredbama printf i scanf.
Ako u C++ radimo sa konzolskim aplikacijama (vjerujte
mi da je ozbiljno programiranje 90% rad na konzoli) i dalje moemo
da koristimo ovu biblioteku, ali se zbog OO orjentacije
preporuuje korienje iostream.h. Napominjemo da po
standardu C++ nije potrebno naglaavati .h za
najee koriene biblioteke u pretprocesorskoj
direktivi #include, ali da vei broj kompajlera .h
podrava a neki na tome jo uvijek insistiraju.

iostream.h

Naredbe (nijesu naredbe, ali ih za poetak moemo tako zvati)


za formatizovani ulaz/izlaz u biblioteci iostream.h
su: cin (ita se si-in) i cout (ita se si-aut).
cin se koristi za standardni ulaz:
cin>>a>>b>>c;
Na ovaj nain se ono to se unese sa tastature
smijeta redom u promjenljive a, b, c koje mogu
biti bilo kog tipa podataka ukljuujui i string
(pokaziva na niz karaktera). Znai, ne koristimo adresu kao
kod scanf-a i ne objanjavamo kojeg je tipa
podatak (%d).

Naredba cout

Naredba cout se koristi za standardni izlaz:


cout<<a<<Neki
tekst<<2<<a+2<<\n<<endl;
Na ovaj nain smo odtampali promjenljivu a,
zatim string Neki tekst, broj 2, vrijednost izraza
a+2, preli u novi red i konano sa endl ponovo
preli u novi red (endl je skraenica od kraj linije - end of line).
Za nekoliko nedjelja (negdje nakon prvog
kolokvijuma) shvatiemo da cin i cout nijesu
naredbe i da >> i << imaju sasvim specifino
znaenje.

Alokacija i dealokacija

Niko nam ne brani da i dalje koristimo naredbe malloc i


free iz standardnog zaglavlja alloc.h.
Meutim, programski jezik C++ posjeduje naredbe (u
stvari operatore ugraene u jezik za ije korienje nije potrebna programska

koje bolje podravaju OO metodologiju: new (za


alokaciju) i delete (za dealokaciju).
int *p=new int;
//zauzima memoriju za jedan cijeli
//broj na koji pokazuje p
int *p=new int(3); //isto kao gore uz inicijalizaciju broja
na //koji pokazuje p na cijeli broj 3
int *p=new int[50]; //alocira memoriju za 50 cijelih
brojeva,
//a p pokazuje na poetak niza
biblioteka )

Alokacija i dealokacija

Alokacija je, kolski reeno, obavezno praena


provjerom alokacije, ali, grubo govorei, savremeni
C++ kompajleri dozvoljavaju adresiranje ogromnog
adresnog prostora i ako alokacija ne uspije nema
anse ni da vam ostatak koda dobro radi jer su
vjerovatno gotovo svi sistemski resursi potroeni.
Ipak, uvijek vrite provjeru ispravnosti alokacije.
Dealokacija se vri sa:
delete p; //ako je u pitanju podatak na koji pokazuje
p
delete [] p; //ako je u pitanju niz
esto se p postavlja na NULL (ili 0) nakon
dealokacije da bi sugerisao ostatku koda da u tom
trenutku ne pokazuje na podatak.

Reference

Nauili smo: funkcija se moe pozvati po


vrijednosti (call by value) i po referenci.
Nauili smo: programski jezik C ne posjeduje
referencu, pa se poziv po referenci simulira
preko pokazivaa.
Stariji programski jezici (recimo Pascal)
posjeduju referencu.
Programski jezik C++ pored pokazivaa
posjeduje referencu.
Pa to je onda referenca?

Referenca u C++

Referenca je drugo ime za neki memorijski objekat


(ponekad se naziva alijas, npr. Muhamed Ali alijas
Kasijus Klej).
Referenca se moe koristiti i u dijelu glavnog programa:
int &j=i;
j=3;
Nakon ovog koda j=3, ali i i=3, jer su to samo dva
imena za isti objekat. Uoimo da referenca mora biti
inicijalizovana! nekim memorijskim objektom, za razliku
od pokazivaa koji ne mora. Dalje, pristup referenci ne
zahtjeva navoenje operatora (nijesmo pisali &j=3).

Reference i pokazivai

Referenca ne moe da promjeni objekat na koji se


odnosi, niti da pokae na NULL objekat. Npr.
int i=3;
int &j=i,k=2; //j=3 jer je isto kao i
j=k;
//i=2 jer je isto to i j
i=4;
//j=4, ali k i dalje ostaje 2,
jer nije to j
Referenca se rijetko koristi u programu (jedino ako
jedan dio programera koji rade na programu neku promjenljivu
zovu na jedan nain, a drugi dio na drugi nain)

prevashodna primjena kod funkcija.

ve je

Reference i funkcije

Npr. dio glavnog programa: int a=2,b=3; fun(a,b);


Neka je funkcija: void fun(int i,int &j) {i++; j++}
j je u funkciji samo
Oigledno je da se pokaziva i referenca
drugo ime za
mogu koristiti za sline namjene.
promjenljivu b iz
glavnog programa,
Postoje sljedea pravila:
stoga promjena j u

Ako promjenljiva moe da pokae na NULL funkciji ima uticaj na


promjenukoriste
b u glavnom
ili moe da promjeni promjenljivu na koju ukazuje
programu
se pokazivai.
Ako je objekat memorijski zahtjevan treba koristiti
referencu jer ne dolazi do kopiranja objekta za potrebe
funkcije, ve funkcija samo koristi drugo ime za isti
objekat da bi mu pristupila. tedi se i u dealokaciji
ovakvih objekata.

Referenca kao rezultat


funkcije

Funkcija moe da vrati rezultat koji je referenca. Npr.


int &f(int &i) {return i;}

Ova oznaka znai da funkcija


vraa kao rezultat
Primjer glavnog programa: memorijski objekat koji mora
biti alociran u pozivajuem
void main(){int x; f(x)=1;} modulu (recimo u glavnom
programu).
Ovo je nevjerovatan poziv. Suprotno
onome to smo

do

sada uili, funkcija (njen rezultat) moe biti na lijevoj


strani ako funkcija vraa referencu. U ovom sluaju
funkcija vraa argument funkcije (x) i to stvarni objekat
tako da je rezultat ove operacije x=1;. Za sada je ovo
samo atrakcija, ali emo ovo upotrebljavati dosta kasnije
u naem kursu. Ve za nekoliko nedjelja koristiemo
rezultat koji je referenca da bi utedjeli na kopiranju
objekata prilikom vraanja rezultata.

Reference Dodatna
pravila

Ne moe se deklarisati:

referenca na referencu;
referenca na polje bitova;
referenca na void;
pokaziva na referencu.

switch-case - enum

U C-u, argument naredbe switch mogao je biti samo cijeli


broj (ili cjelobrojni izraz ili neto to se moe konverzijama
dovesti do cijelog broja). U C++ argument naredbe switch
moe biti bilo koji tip podatka.
Nabrajanje (enumeracija) ima istu strukturu i ista pravila
kao u C-u. Npr.
enum color {bijelo=0, crno=7, zeleno=3, plavo=1};
Osnovna razlika je da ime nabrajanja koje po pravilu
nijesmo ni navodili ni koristili u C-u (u ovom sluaju color)
ovdje po pravilu navodimo i esto koristimo. Naime, color
je sada pored skupine cjelobrojnih konstanti i pravi tip
podatka (mogue je deklarisati color a;) koji moe uzeti
samo navedene vrijednosti i koji moe biti argument i
rezultat funkcije: color fun(color x, int a){/**/}.

exit i abort

Funkcija exit (standardno zaglavlje stdlib.h)


zatvara sve otvorene fajlove i vraa cjelobrojnu
konstantu kao rezultat operativnom sistemu. U
C++ ova funkcija pored prekidanja programa i
navedenih operacija poziva funkciju atexit na
koju moe da utie programer.
Alternativno moe se koristiti funkcija abort
koja prekida izvravanje programa bez
mogunosti intervencije i bez obavjetavanja
OS-a.
Ovim smo zavrili pregled razlika prevashodno
neobjektne prirode izmeu C-a i C++-a. Od
naredne nedjelje uplovljavamo u vode OOP.

You might also like