3. 02 cpp klase (krace)
TRANSCRIPT
Objektno-orijentisano
programiranje
1. Inline funkcije
2. Prenos parametara
3. Statički članovi klase
Ugradjene (inline) funkcije
� Ključna reč inline ispred funkcije
� Nalog kompajleru da ugradi kod u program umesto da se generiše poziv funkcije
� Umanjuje broj poziva funkcija
� Kompajler može da ignoriše inline� Dobro za male funkcije koje se često pozivaju
� Primer:
inline double cube( double s )
{
return s * s * s;
}
Inline funkcije članice klase
� Funkcija članica klase je ugradjena
� Ako je njena implementacija navedena unutar
definicije klase, ili
� Ako ispred njene deklaracije stoji ključna 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 Timevoid Time::setHour( int h ){hour = ( h>=0 && h<24 ) ? h : 0;
}
Prenos parametara
� U jeziku C:
� Prenos argumenata u funkciju - isključivo po vrednosti (by
value)
� Ako funkcija treba da promeni vrednost spoljne promenljive:
� prenosi se pokazivač na tu promenljivu,
� pristup promenljivoj unutar funkcije se vrši indirektnim
adresiranjem.
� U jeziku C++:
� Prenos argumenata u funkciju može biti
� po vrednosti (by value),
� 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)
� Dozvoljeni pozivi funkcije f:
int a=5; b=5;
f(a,b);
f(5,b);
f(5*a,b);
� Nedozvoljeni pozivi funkcije f:f(a,5);
f(a,5*b);
Kada treba koristiti prenos po
referenci?
� Ukoliko funkcija treba da promeni spoljni
objekat,
� Ukoliko zbog velicine objekta koji se prenosi
funkciji ne zelimo da se pravi njegova kopija
u memoriji
� 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
� Rezultat funkcije se može vratiti po referenci samo ako objekat koji se vraća živi i posle izlaska iz funkcije.
� Funkcija po referenci može vratiti:
� formalni argument koji je joj je prenet po referenci
� Funkcija (članica klase) po referenci može
vratiti i:
� Objekat klase za koji je pozvana,
� Bilo koji svoj atribut.
Prenos rezultata funkcije po referenci
� Funkcija po referenci ne može vratiti
� fiktivni parametar prenet po vrednosti,
� lokalni objekat,
� konstantu,
� izraz.
Zašto prenos rezultata funkcije po
referenci?
� Rezultat funkcije vraćen po referenci se može
van funkcije menjati.
� 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);
Pristup članovima klase iz funkcija
članica iste klase
� Navodjenjem samo imena,
� Korišćenjem imena klase i operatora ::
� Korišćenjem pokazivača this.
� this je pokazivač na objekat za koji je funkcija
pozvana.
Pristup članovima klase iz funkcija
članica iste klase� Način 1:
void Time::setHour( int h ){hour = ( h>=0 && h<24 ) ? h : 0;
}
� Način 2:void Time::setHour( int h ){Time::hour = ( h>=0 && h<24 ) ? h : 0;
}
� Način 3:void Time::setHour( int h ){this->hour = ( h>=0 && h<24 ) ? h : 0;
}
Razrešavanje konflikta imena
� Ukoliko je isto ime definisano na više nivoa, poštuje se njegova unutrašnja definicija.
� 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;
}
Statički atributi klase
� Ključna reč static ispred definicije atributa klase označava da postoji samo jedna instanca tog atributa, bez obzira na to koliko je objekata klase u programu kreirano.
� static atribut je neka zajednička osobina svih objekata te klase.
� static atribut se može koristiti van klase i kada ni jedan objekat klase nije kreiran navodjenjem:
<ime_klase>::<ime_static_atributa>
� static atribut mora da bude definisan i na globalnom nivou.
� static atribut ima vek trajanja globalnog objekta – živi za sve vreme izvršavanja programa.
Primer statičkog atributa
� U definiciji klase:class A{public:static int count;…
};
� Negde na globalnom nivou (obično u A.cpp fajlu):int A::count;
� Korišćenje u funkcijama članicama klase:� ... count ...� ... this->count ... //nije preporucljivo� ... A::count ...
� Korišćenje van klase:� ... A::count ...
Statičke metode klase
� Statičke metode klase se ponašaju kao globalne metode. Mogu da se pozovu i kada ni jedan objekat klase nije kreiran u programu.
� Statička metoda može pristupati samo statičkim članovima klase.
� Poziv statičke metode:
<ime_klase>::<ime_static_metode>(<stvarni_argumenti>)
Zadatak.
Na programskom jeziku C++, kreirati klasu Radnik čiji su članovi:
� privatni atributi: ime, prezime i koeficijent stručne spreme radnika;
� javni statički atributi: broj radnika preduzeća, cena rada za tekući mesec u preduzeću, visina naknade za prevoz po radniku;
� javne metode za: učitavanje vrednosti privatnih atributa sa standardnog ulaza, za štampanje imena prezimena i plate radnika na standardni izlaz (pri čemu se plata računa kao proizvod koeficijenta stručne spreme i cene rada);
� javna statička metoda za izračunavanje ukupno potrebnih sredstava za isplatu naknade za prevoz radnika ukoliko se svima isplaćuje ista svota.
U funkciji main, učitati broj radnika, visinu cene rada, visinu naknade
za prevoz i podatke o svim radnicima sa standardnog ulaza i na
standardni izlaz prikazati platni spisak radnika i veličinu sredstava
potrebnih da se isplati naknada za prevoz svim radnicima.