21
Objektno-orijentisano programiranje 1. Inline funkcije 2. Prenos parametara 3. Statički članovi klase

3. 02 CPP Klase (Krace)

  • Upload
    lovke88

  • View
    23

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 3. 02 CPP Klase (Krace)

Objektno-orijentisano

programiranje

1. Inline funkcije

2. Prenos parametara

3. Statički članovi klase

Page 2: 3. 02 CPP Klase (Krace)

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;

}

Page 3: 3. 02 CPP Klase (Krace)

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.

Page 4: 3. 02 CPP Klase (Krace)

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;

}

Page 5: 3. 02 CPP Klase (Krace)

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).

Page 6: 3. 02 CPP Klase (Krace)

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;

}

Page 7: 3. 02 CPP Klase (Krace)

Prenos parametara (primer)

After calling fubction f:

a=5 b=6

Page 8: 3. 02 CPP Klase (Krace)

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);

Page 9: 3. 02 CPP Klase (Krace)

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.

Page 10: 3. 02 CPP Klase (Krace)

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. */

Page 11: 3. 02 CPP Klase (Krace)

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.

Page 12: 3. 02 CPP Klase (Krace)

Prenos rezultata funkcije po referenci

� Funkcija po referenci ne može vratiti

� fiktivni parametar prenet po vrednosti,

� lokalni objekat,

� konstantu,

� izraz.

Page 13: 3. 02 CPP Klase (Krace)

Zašto prenos rezultata funkcije po

referenci?

� Rezultat funkcije vraćen po referenci se može

van funkcije menjati.

� Ušteda memorijskog prostora.

Page 14: 3. 02 CPP Klase (Krace)

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);

Page 15: 3. 02 CPP Klase (Krace)

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.

Page 16: 3. 02 CPP Klase (Krace)

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;

}

Page 17: 3. 02 CPP Klase (Krace)

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;

}

Page 18: 3. 02 CPP Klase (Krace)

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.

Page 19: 3. 02 CPP Klase (Krace)

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 ...

Page 20: 3. 02 CPP Klase (Krace)

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>)

Page 21: 3. 02 CPP Klase (Krace)

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.