Informatiile acestui spatiu sunt gratuite. Observatii si sugestii pot fi trimise pe adresa de contact sau pe forum.

     Apelul prin referinta al functiilor

Forma generala:

void nume_functie(tip_var_1 var_1, ... , tip_var_n &var_n)
{
     instructiune 1;
     ...
     instructiune n;
}

unde:

  • void - reprezinta tipul functiei
  • nume_functie - reprezinta identificatorul cu ajutorul caruia functia va fi apelata pe parcursul programului
  • lista de parametri formali:
    • tip_var_1...tip_var_n - reprezinta tipul variabilelor/parametrilor formali
    • &var_1...&var_n - reprezinta parametrii formali ai functiei
  • intre acolade se trece corpul functiei - setul de instructiuni ce va prelucra parametrii formali in scopul returnarii unui rezultat.

Exemplu:

     void schimba (int &x, int &y)
     {
         int temp;
         temp=x;
         x=y;
         y=temp;
     }

Explicatii:

  • void - tipul functiei este void deoarece functia, in cazul de fata, nu intoarce un alt rezultat programului/functiei apelante, ca in cazul apelurilor prin valoare;
  • schimba - numele functiei;
  • int &x, int &y - lista de parametri formali ai functiei schimba: acesti parametri reprezinta adresele de memorie a doua variabile (&x, &y) de tip int;
  • int temp - declararea unei variabile locale functiei schimba, in care se va stoca temporar valoarea aflata la o adresa de memorie corespunzatoare variabilelor x si y
  • temp=x; x=y; y=temp; - interschimbarea valorilor aflate la adresele de memorie &x si &y

Observatii:

  1. tipul functiei este void - in acest caz, functia nu va returna nici o alta valoare programului/functiei apelante
  2. lista de parametri formali este obligatorie, functia producand rezultate numai prin intermediul acestora
  3. cand exista mai multe functii care se apeleaza reciproc, se foloseste prototipul functiilor (vezi conceptele functiilor prezentate in capitolul anterior);
  4. spre deosebire de cazul apelului prin valoare al functiilor, in cazul apelului prin referinta, parametrii formali nu mai sunt niste copii ale parametrilor efectivi ai functilor ci chiar adresele de momorie alea acestora. Astfel, operatiile efectuate in cadrul functiilor se vor efectua direct asupra acestor variabile, schimbandu-le valoarea.

Exemplul 1: Sa se interschimbe valorile a doua variabile prin intermediul unei functii.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
int x, y;
void schimba (int &x, int &y)
{
   int temp;
   cout<<"Valorile variabilelor in cadrul functiei:"<<endl;
   temp=x;
   cout<<"temp="<<temp<<endl;
   cout<<"x="<<x<<endl;
   cout<<"y="<<y<<endl<<endl;
   x=y;
   cout<<"x="<<x<<endl;
   cout<<"y="<<y<<endl<<endl;
   y=temp;
   cout<<"temp="<<temp<<endl;
   cout<<"x="<<x<<endl;
   cout<<"y="<<y<<endl<<endl;
}
int main()
{
   cout<<"x=";cin>>x;
   cout<<"y=";cin>>y;
   cout<<"Inaintea apelului functiei: x="<<x<<" si y="<<y<<endl;
   schimba(x,y);
   cout<<"Dupa apelului functiei: x="<<x<<" si y="<<y<<endl;
}
x=2
y=3
Inaintea apelului functiei: x=2 si y=3
Valorile variabilelor in cadrul functiei:
temp=2
x=2
y=3

x=3
y=3

temp=2
x=3
y=2

Dupa apelului functiei: x=3 si y=2











Observatii:

  • In programul de mai sus, numele parametrilor efectivi este acelasi cu numele parametrilor formali. Parametrii formali preiau adresele parametrilor efectivi si, de aceea, apar aceleasi nume de variabile atat in lista de parametri afectivi (in apelul functiei) cat si in lista de parametri formali (in definitia functiei);
  • Daca in cadrul programului de mai sus utilizam apelul prin valoare, atunci:
    • parametrii formali nu vor mai fi adrese de variabile ci copii ale acestora (cu alt nume/identificator
    • numele variabilelor utilizate in lista de parametrii formali (din definitia functiei) este diferit de numele utilizate in lista de parametri efectivi (din apelul functiei)
    • valorile variabilelor ce se doresc a fi interschimbate (date in programul principal si transmise prin parametrii efectivi ai apelului functiei) nu se vor schimba
    • valorile parametrilor formali se vor schimba in cadrul functiei - fara a afecta valorile parametrilor afectivi ai functiei.
    • Scopul de a interschimba valorile a doua variabile nu va fi atins.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
int a, b;
void schimba (int x, int y)
{
   int temp;
   cout<<"Valorile variabilelor in cadrul functiei:"<<endl;
   temp=x;
   cout<<"temp="<<temp<<endl;
   cout<<"x="<<x<<endl;
   cout<<"y="<<y<<endl<<endl;
   x=y;
   cout<<"x="<<x<<endl;
   cout<<"y="<<y<<endl<<endl;
   y=temp;
   cout<<"temp="<<temp<<endl;
   cout<<"x="<<x<<endl;
   cout<<"y="<<y<<endl<<endl;
}
int main()
{
   cout<<"a=";cin>>a;
   cout<<"b=";cin>>b;
   cout<<"Inaintea apelului functiei: a="<<a<<" si b="<<b<<endl;
   schimba(a,b);
   cout<<"Dupa apelului functiei: a="<<a<<" si b="<<b<<endl;
}
a=2
b=3
Inaintea apelului functiei: a=2 si b=3
Valorile variabilelor in cadrul functiei:
temp=2
x=2
y=3

x=3
y=3

temp=2
x=3
y=2

Dupa apelului functiei: a=2 si b=3











Exemplul 2: Sa se afle patratul unui numar prin intermediul unei functii cu apel prin referinta.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int a;
void patrat (int &a)
{
   a=a*a; }
int main()
{
   cout<<"a=";cin>>a;
   cout<<"Inaintea apelului functiei: a="<<a<<endl;
   patrat(a);
   cout<<"Dupa apelului functiei: a="<<a<<endl;
}
a=2
Inaintea apelului functiei: a=2
Dupa apelului functiei: a=4