C++
Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Funkcije
Funkcije su blokovi koda koji se pokreću samo kada su pozvani.
Prednosti funkcija:
- Nema dupliciranja koda
- Kod je lakši za čitati
- Kod je lakši za održavati
- Lakše je pronaći i ispraviti greške
Primjer definicije funkcije bi mogao biti:
void PrintHelloWorld (){
cout << "Hello World!";
}
Ova funkcija se sastoji iz 4 dijela:
PrintHelloWorld
- Naziv funkcije.void
- Tip podatka koji funkcija vraća.()
- Parametri koje funkcija prima.{cout << "Hello World!";}
- Tijelo funkcije.
Funkciju iz prethodnog primjera moguće pozvati tako što se njen naziv napiše u tijelu main funkcije.
Dakle, funkciju je potrebno definisati iznad mjesta njenog prvog poziva (u ovom slučaju prije same main funkcije) kako bi se ona mogla pozvati.
Poziv funkcije se desio u 11. liniji koda u primjeru (PrintHelloWorld()
).
Poziv funkcije se sastoji iz 2 dijela:
PrintHelloWorld
- Naziv funkcije.()
- Parametri koje funkcija prima (ova funkcija ne prima nikakve parametre).
Ali čemu funkcija kada smo u main mogli napisati
cout << "Hello World!";
?
Recimo da na ekran želimo ispisati ovu poruku 5 puta.
Bez funkcije, kopirali bismo liniju koda 5 puta.
Izgleda da smo zaboravili staviti endl
na kraju ispisa ove poruke. Kako bismo ovo popravili, moramo naći svako mjesto u našem programu gdje se pojavila ova linija koda i dodati endl
. To može biti ogroman posao i postoje velike šanse da ćemo propustiti neko od pojavljivanja ove linije koda.
Kada bi koristili funkcije, taj program bi izgledao ovako
Izlaz ovog programa je isti kao izlaz prethodnog, ali ovaj put endl
moramo dodati samo jednom i svi pozivi ove funkcije će biti popravljeni.
Možete sami pokušati srediti ove probleme u prethodnim primjerima.
U ovom primjeru je jednostavno vidjeti zašto je lakše ispraviti greške kada se blokovi koda nalaze u funkcijama čak i u ovako maloj funkciji koja se poziva samo 5 puta.
Kompleksniji primjer funkcije
Funkcija koju smo posmatrali je veoma jednostavna. Ne prima nikakve parametre, niti ima povratnu vrijednost.
Primjer funkcije koja prima parametere:
void PrintBroj (int n){
cout << "Broj je: " << n << endl;
}
Ako pogledamo deklaraciju ove funkcije vidimo da parametri koje funkcija prima više nisu ()
. (int n)
naglašava da pri pozivu ove funkcije moramo proslijediti neki integer funkciji.
U ovom slučaju možemo primjetiti da se i poziv funkcije razlikuje. Sada smo u zagradi pri pozivu funkcije obavezni proslijediti i jedan broj. Varijabla n
u funkciji je kopija vrijednosti koja je proslijeđena pri pozivu funkcije.
Funkcija može primati i više od jednog parametra.
Ova funkcija odlično radi svoj posao, ali možda nam nije uvijek potrebno da se zbir odmah ispiše na ekranu. Možda bismo radije pohranili vrijednost zbira u neku varijablu ili ga ispisali na svoj način.
Kako bismo to uradili potrebno je definisati koji je tip povratne vrijednosti iz ove funkcije. Također je potrebno označiti koja se to vrijednost vraća iz funkcije pomoću return
keyword-a.
int Saberi (int a, int b){
return a + b;
}
void
funkcije koje smo dosad koristili nemaju nikakav tip povratne vrijednosti. Nova funkcija koju smo definisali ima tip povratne vrijednosti int
što znači da će funkcija vratiti neku brojevnu vrijednost, a ta vrijednost je a + b
.
Vrijednost koju funkcija vrati možemo tretirati kao bilo koju drugu vrijednost u C++ (pohraniti u varijablu, ispisati na ekran...)
Više funkcija sa istim imenom
Moguće je imati više funkcija sa istim nazivom. Način na koji kompajler prepoznaje koju funkciju pozivamo je po proslijeđenim parametrima.
Niz kao parametar
Funkcije pored primitivnih tipova varijabli mogu primiti i niz kao parametar. Kako bismo to uradili potrebno je proslijediti sam niz, kao i veličinu niza funkciji.
Na ovaj način funkciju možemo napisati samo jednom i biti sigurni da funkcija radi i na ostalim mjestima tako da nema dupliciranja koda.
Vrste parametara
Vrijednost parametara koji su dati funkciji se kopira u varijablu koja je parametar funkcije. To znači da kada koristimo varijable kao parametre funkcije možemo biti sigurni da se njihova vrijednost neće promijeniti.
Ova vrsta parametra se naziva parametar po vrijednosti.
Drugi način da proslijedimo parametar funkciji je po referenci. U tom slučaju svaka promjena na parametru u funkciji će se odraziti na varijablu koja je proslijeđena samoj funkciji.
To se radi tako što se doda znak '&' u deklaraciji funkcije.
U ovom slučaju se promijenila i vrijednost varijable a.
U ovom slučaju je također nemoguće pozvati funkciju sa nekom konstantom kao parametrom. Uvecaj(7)
bi vratilo grešku jer program ne može promijeniti vrijednost samog broja 7.
Primjeri
1. Kopija pow
funkcije
Pow funkcija prima 2 parametra, prvi parametar jer baza, a drugi eksponenta izraza. Ova funkcija vraća rezultat izraza i nalazi se u "algorithm" biblioteci.
Sami možemo napisati ovu funkciju na idući način:
2. Operacije s nizovima
Već smo napisali funkciju za ispis svih članova niza.
U ovom primjeru ćemo napraviti 2 nove funkcije. Njihov zadatak je da vrate najveći i najmanji član u nizu.
U posljednjem primjeru je funkciju koja pronalazi najveći i najmanji član niza bilo potrebno napisati samo jednom, a onda je možemo pozvati koliko god puta želimo. Ukoliko kasnije pronađemo neku grešku u ovim funkcijama morat ćemo ih popraviti na samo jednom mjestu.