You are on page 1of 14

Objektno-orijentisano

programiranje
1. Inline funkcije
2. Prenos parametara
3. Podrazumevanevrednosti parametara
4. Oblast vaenja imena i vek trajanja objekata
5. Stati#ki #lanovi klase
Ugradjene (inline) funkcije
n Kljuna re inline ispred funkcije
n Nalog kompajleru da ugradi kod u program
umesto da se generi#e poziv funkcije
q Umanjuje broj poziva funkcija
q Kompajler mo%e da ignori#e inline
q Dobro za male funkcije koje se esto pozivaju
n Primer:
inline double cube( double s )
{
return s * s * s;
}
Inline funkcije lanice klase
n Funkcija lanica klase je ugradjena
q Ako je njena implementacija navedena unutar
definicije klase, ili
q Ako ispred njene deklaracije stoji kljuna re
inline, a implementacija je navedena u header
fajlu.
Inline funkcije lanice klase
class Time
{
public:
...
int getHour()
{
return hour;
}
inline void setHour( int h );
private:
...
}; // end class Time
void Time::setHour( int h )
{
hour = ( h>=0 && h<24 ) ? h : 0;
}
Prenos parametara
n U jeziku C:
q Prenos argumenata u funkciju - iskljuivo po vrednosti (by
value)
q Ako funkcija treba da promeni vrednost spoljne promenljive:
n prenosi se pokaziva na tu promenljivu,
n pristup promenljivoj unutar funkcije se vr #i indirektnim
adresiranjem.
n U jeziku C++:
q Prenos argumenata u funkciju mo%e biti
n po vrednosti (by value),
n po referenci (by reference).
Prenos parametara (primer)
void f(int i, int &j) // i po vrednosti,
// j po referenci
{
i++;
j++;
}
void main()
{
int a=5; b=5;
f(a,b);
cout << After calling function f: << endl;
cout << a= << a << \tb= << b << endl;
}
Prenos parametara (primer)
After calling fubction f:
a=5 b=6
Prenos parametara (primer)
n Dozvoljeni pozivi funkcije f:
int a=5; b=5;
f(a,b);
f(5,b);
f(5*a,b);
n Nedozvoljeni pozivi funkcije f:
f(a,5);
f(a,5*b);
Kada treba koristiti prenos po
referenci?
n Ukoliko funkcija treba da promeni spoljni
objekat,
n Ukoliko zbog velicine objekta koji se prenosi
funkciji ne zelimo da se pravi njegova kopija
u memoriji
q Ukoliko zelimo da zabranimo da funkcija menja
argument prenet po referenci, treba ga obeleziti
kao konstantan.
Prenos parametara
void f(Time t);
/*U trenutku poziva funkcije f pravi se lokalna kopija
objekta klase Time. Promene objekta t unutar funkcije se
ne odrazavaju na promenu objekta koji se navodi kao
stvarni argument u pozivu funkcije. */
void g(Time& t);
/*U trenutku poziva funkcije g ne pravi se lokalna kopija
objekta klase Time. t je samo drugo ime za objekat koji
se prosledjuje kao stvarni argument. Promena objekta t
unutar funkcije je, u stvari, promena njenog stvarnog
argumenta.*/
void q(const Time& t);
/*U trenutku poziva funkcije q ne pravi se lokalna kopija
objekta klase Time. t je i sada drugo ime za objekat
koji se prosledjuje kao stvarni argument, ali je taj
objekat za funkciju konstantan tj. funkcija nema pravo
da ga menja. */
Prenos rezultata funkcije po referenci
n Rezultat funkcije se mo%e vratiti po referenci
samo ako objekat koji se vra'a %ivi i posle
izlaska iz funkcije.
n Funkcija po referenci mo%e vratiti:
q formalni argument koji je joj je prenet po referenci
n Funkcija (lanica klase) po referenci mo%e
vratiti i:
q Objekat klase za koji je pozvana,
q Bilo koji svoj atribut.
Prenos rezultata funkcije po referenci
n Funkcija po referenci ne mo%e vratiti
q fiktivni parametar prenet po vrednosti,
q lokalni objekat,
q konstantu,
q izraz.
Za#to prenos rezultata funkcije po
referenci?
n Rezultat funkcije vra'en po referenci se mo%e
van funkcije menjati.
n U#teda memorijskog prostora.
Primer prenosa rezultata funkcije po
referenci
class Vector
{
public:
int& getElement( int k ) { return a[k]; }

private:
int n;
int* a;
};
//call of the function getElement
cin >> getElement(5);
Podrazumevane vrednosti
parametara
n U deklaraciji funkcije se mogu navesti podrazumevane vrednosti
argumenata.
q Deklaraciija funkcije sa podrazumevanim vrednostima
argumenata:
void f( float a=0.5f, int k=0 );
n Podrazumevane vrednosti argumenata se koriste ukoliko u
pozivu funkcije odgovaraju'i stvarni argument nije naveden.
q Dozvoljeni pozivi funkcije f:
f( 15.5f, 2 );
f( 15.5f );
f( 2 ); // a dobija vrednost 2
f();
Podrazumevane vrednosti
parametara
n Podrazumevane vrednosti mogu imati samo
poslednji parametri u listi.
q Dozvoljena definicija funkcije sa podrazumevanim
vrednostima parametara:
void f( float a, int k=0 );
q Nedozvoljena definicija funkcije sa
podrazumevanim vrednostima parametara:
void f( float a=0.5f, int k );
Oblast va%enja imena
n Onaj deo programa u kome se deklarisano ime
mo%e koristiti.
n Prema oblasti va%enja imena mogu biti:
q Globalna
n Imena koja se deklari#u van svih funkcija,
n Oblast va%enja je od mesta deklaracije do kraja fajla u kojem
su deklarisani.
n Objekat ili funkcija definisani na globalnom nivou u jednom
fajlu, mogu biti deklarisani i kori #'eni u drugim fajlovima.
q Lokalna
n Imena koja se defini#u unutar nekog bloka,
n Oblast va%enja je od mesta deklaracije do kraja bloka u kojem
su deklarisana.
Oblast va%enja imena
n Oblast va%enja imena definisanih u zaglavlju for
petlje:
q Po standardu u telu petlje,
q Po nekim prevodiocima (npr. VS C++ 6.0) do kraja bloka
u kojem je petlja definisna.
Ispravno po standardu:
for (int i=0; i<10; i++)
{ }
for (int i=0; i<50; i++)
{ }
Ispravno po VS C++ 6.0:
for (int i=0; i<10; i++)
{ }
if ( i==m )
{ }
for (i=0; i<50; i++)
{ }
Oblast va%enja imena
n Oblast va%enja imena deklarisanih u definiciji
klase:
q Klasa u ijoj su definiciji navedeni
q Van klase, javnim imenima se mo%e pristupati
kori#'enjem operatora:
n . ako je levi operand objekat klase,
n -> ako je levi operand pokaziva na objekat klase,
n :: ako je levi operand klasa.
Pristup lanovima klase iz funkcija
lanica iste klase
n Navodjenjem samo imena,
n Kori#'enjem imena klase i operatora ::
n Kori#'enjem pokazivaa this.
q this je pokaziva na objekat za koji je funkcija
pozvana.
Pristup lanovima klase iz funkcija
lanica iste klase
n Nain 1:
void Time::setHour( int h )
{
hour = ( h>=0 && h<24 ) ? h : 0;
}
n Nain 2:
void Time::setHour( int h )
{
Time::hour = ( h>=0 && h<24 ) ? h : 0;
}
n Nain 3:
void Time::setHour( int h )
{
this->hour = ( h>=0 && h<24 ) ? h : 0;
}
Razre#avanje konflikta imena
n Ukoliko je isto ime definisano na vi#e nivoa, po#tuje se njegova
unutra#nja definicija.
n Primer:
void Time::setHour( int hour )
{
Time::hour = ( hour>=0 && hour<24 ) ? hour : 0;
}
void Time::setHour( int hour )
{
this->hour = ( hour>=0 && hour<24 ) ? hour : 0;
}
Vek trajanja objekta
n Vreme u toku izvr#enja programa u kojem objekat
postoji u memoriji.
n Prema vremenu trajanja objekti mogu biti:
q Statiki
n Objekti definisani na globalnom nivou
n Vek trajanja je za sve vreme izvr #enja programa,
q Automatski
n Objekti definisani unutar bloka ili fiktivni argumenti funkicje
n Vek trajanja je od njegovog kreiranja do zavr#etka izvr#enja
bloka u kojem je deklarisan,
q Dinamiki
n Objekti kreirani u dinami koj zoni memorije
n Vek trajanja od kreiranja do eksplicitnog brisanja.
q Privremeni
n Medjurezultati nekih izraza ili povratne vrednosti funkicja
Znaenje kljune rei static
(nasledjeno iz programskog jezika C)
n Kljuna re static menja oblast va%enja imena i
vek trajanja objekta.
n static ispred definicije globalnog imena
q Oblast va%enja imena su%ava na fajl u kojem je ono
definisano.
n static ispred definicije lokalnog objekta
q )ivotni vek objekta se produ%ava
n od trenutka prvog izvr#enja bloka u kojem je definisan do kraja
rada programa.
q Oblast va%enja imena i dalje ostaje blok u kojem je
definisano.
Lokalni objekat definisan kao
static
n Ukoliko je u njegovoj definisiji izvr#ena i inicijalizacija,
inicijalizacija se vr#i samo jednom kada se funkcija pozove prvi
put.
n Primer:
q Broja poziva funkcije definisan kao lokalni static objekat
void f(...)
{
static int b=0;
b++;
...
}
Statiki atributi klase
n Kljuna re static ispred definicije atributa klase oznaava da
postoji samo jedna instanca tog atributa, bez obzira na to koliko je
objekata klase u programu kreirano.
n static atribut je neka zajednika osobina svih objekata te klase.
n static atribut se mo%e koristiti van klase i kada ni jedan objekat
klase nije kreiran navodjenjem:
<ime_klase>::<ime_static_atributa>
n static atribut mora da bude definisan i na globalnom nivou.
n static atribut ima vek trajanja globalnog objekta %ivi za sve
vreme izvr #avanja programa.
Primer statikog atributa
n U definiciji klase:
class A
{
public:
static int count;

};
n Negde na globalnom nivou (obino u A.cpp fajlu):
int A::count;
n Kori#'enje u funkcijama lanicama klase:
q ... count ...
q ... this->count ... //nije preporucljivo
q ... A::count ...
n Kori#'enje van klase:
q ... A::count ...
Statike metode klase
n Statike metode klase se pona#aju kao globalne metode. Mogu da
se pozovu i kada ni jedan objekat klase nije kreiran u programu.
n Statika metoda mo%e pristupati samo statikim lanovima klase.
n Poziv statike metode:
<ime_klase>::<ime_static_metode>(<stvarni_argumenti>)

You might also like