pri_p_10_ 2015_16.ppt
DESCRIPTION
dadadTRANSCRIPT
© www.fit.ba
Programiranje IPredavanje 10
Predavač:prof.dr. Murat PrašoStudent:Haris Balta III godina
C++ podržava upotrebu dva oblika parametara: prijenos parametara po vrijednost i prijenos parametara po referenci. Prijenos parametara po vrijednosti – formalni parametar prima kopiju vrijednosti argumenata koja im se prenosi. Kao posljedica toga, ako funkcija napravi bilo kakvu promjenu na parametrima, ovo neće promijeniti vrijednosti argumenta. Na primjer, #include <iostream> using namespace std; void Uradi (int broj);
int main () { int x = 10; Uradi(x); cout << "x = " << x << '\n'; system("PAUSE"); return 0; }
void Uradi (int broj) { broj = 0; cout << "broj = " << broj << '\n'; }
Napomena- u ovom tekstu:formalni parametar je parametarStvarni (aktualni) parametar je argument
Funkcije - nastavak
Poziv funkcije po vrijednosti i poziv funkcije po referenci:
Parametar broj u funkciji Uradi() je parametar po vrijednosti. On se ponaša kao lokalna varijabla u funkciji. Kada se funkcija pozove i vrijednost x se prenese, varijabla broj primi kopiju vrijednosti varijable x. Kao rezultat toga, iako varijabla broj u funkciji mijenja vrijednost na 0, to neće utjecati na varijablu x. Program će dati sljedeći izlaz: broj = 0; x = 10;
Za razliku od parametra po vrijednosti, parametar po referenci prima argument koji se prenosi i sve obavlja direktno na njemu (na originalnoj lokaciji argumenta). Bilo koja promjena parametra po referenci u samoj funkciji, direktno se odnosi i na argument, tj. i on se mijenja. Da bismo definisali parametar po referenci, potrebno je dodati simbol & (operator adrese) iza tipa parametra u deklaraciji funkcije i u zaglavlju definicije funkcije (“funkcija zna adresu stvarnog parametra ili argumenta”).U predhodnom primjeru funkcije Uradi() bilo bi :
void Uradi (int &num);
U kontekstu poziva funkcija, a na osnovu prethodno iznesenog, razlikujemo dvije vrste pridruživanja: priduživanje prema vrijednosti i pridruživanje prema referenci. U praksi (u pogledu funkcija) se mnogo više koristi priduživanje prema vrijednosti.
void Uradi (int &broj) { broj = 0; cout << "broj = " << broj << '\n'; }
- slijedi detaljniji prikaz na primjeru -
vrijednost in1
adresa
vrijednost in2
adresa
Varijabla in1 u memoriji
Varijabla in2 u memoriji
Variajble in1 i in2 upotrijebićemo kao parametre funkcije:
void fff(int in1, int in2);
void fff(int in1, int &in2);
Parametri po vrijednosti
Parametar po vrijednosti
Parametar po referenci
Ili izlazni parametar
& je adresni operator – funkcija fff “zna” memorijsku adresu varijable in2
#include <iostream>using namespace std;void fff(int in1, int in2);int main(){int brojac = 7, indeks = 12; cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
fff(brojac, indeks);
cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
return 0;}
//definicija funkcije
void fff(int in1, int in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Poziv funkcije po vrijednosti :
Funkciji fff se, kod poziva, daju kopije vrijednosti (7, 12)
Prikazujemo vrijednosti in1 i in2:
-prije poziva funkcije fff
-iz funkcije fff
-nakon poziva funkcije fff
7 in1
adresa
12 in2
adresa
fff(brojac, indeks);
Adresa (poziva)
in1
in2
//definicija funkcije
void fff(int in1, int in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Adresa (poziva)
7
12
107
112
7 in1
adresa
12 in2
adresa
7
12
Adresa (poziva)
(in1 = in1 + 100) je 107
(in2 = in2 + 100) je 112
in1
in2
//definicija funkcije
void fff(int in1, int in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Adresa (poziva)
#include <iostream>using namespace std;
void fff(int in1, int in2);
int main(){int brojac = 7, indeks = 12;
cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
fff(brojac, indeks);
cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
return 0;}
#include <iostream>using namespace std;
void fff(int in1, int &in2);
int main(){int brojac = 7, indeks = 12;
cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
fff(brojac, indeks);
cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
return 0;}
//definicija funkcije
void fff(int in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Poziv funkcije po referenci :
Funkciji fff se, kod poziva, daje kopija vrijednosti 7 za parametar po vrijednosti a za referentni parametar funkcija fff “zna” adresu.
int in1 parametar po vrijednosti
int &in2 parametar po refrenci
7 in1
adresa
12 in2
adresa
fff(brojac, indeks);
Adresa (poziva iz main)
in1
//definicija funkcije
void fff(int in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Adresa (poziva)
7
107
112
7 in1
adresa
12 in2
adresa
7Adresa (poziva iz main)
(in1 = in1 + 100) je 107
in1
//definicija funkcije
void fff(int in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Adresa (poziva)
#include <iostream>using namespace std;
void fff(int in1, int &in2);
int main(){int brojac = 7, indeks = 12;
cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
fff(brojac, indeks);
cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
return 0;}
112
#include <iostream>using namespace std;
void fff(int &in1, int &in2);
int main(){int brojac = 7, indeks = 12;
cout << "vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
fff(brojac, indeks);
cout <<"vrijednosti su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
return 0;}
//definicija funkcije
void fff(int &in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Poziv funkcije po referenci :
Kod poziva, ne daju se kopije parametara __za referentne parametre funkcija fff “zna” adrese.
int &in1 parametar po referenci
int &in2 parametar po refrenci
7 in1
adresa
12 in2
adresa
fff(brojac, indeks);
Adresa (poziva iz main)
in1
//definicija funkcije
void fff(int &in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Adresa (poziva)
112
107
7 in1
adresa
12 in2
adresa Adresa (poziva iz main)
//definicija funkcije
void fff(int &in1, int &in2){ in1 = in1 + 100; in2 = in2 + 100; cout <<"vrijednosti iz funkcije su "; cout<<"\t"<<in1<<"\t"<<in2<<endl;}
Adresa (poziva)
#include <iostream>using namespace std;
void fff(int &in1, int &in2);
int main(){int brojac = 7, indeks = 12;
cout << "vrijednosti prije poziva funkcije su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
fff(brojac, indeks);
cout <<"vrijednosti nakon poziva funkcije su "; cout<<"\t"<<brojac<<"\t"<<indeks<<endl;
return 0;}
112
107