Transmiterea parametrilor
Parametrii sunt variabile speciale care permit trimiterea de informații către un subprogram. Există două tipuri de parametri:
- Parametri formali: apar în definirea funcției, în antet;
- Parametri actuali: sunt variabilele trimise în momentul apelării unui subprogram.
void functie(int a, int b); // parametri formali
int main() {
int c;
functie(c, 3); // parametri actuali
}
Parametrii actuali nu conțin tipuri de dată, sau dimensiuni (în cazul tablourilor).
Transmiterea prin valoare
Pentru parametrii transmiși prin valoare, se copiază conținutul lor în parametrii formali, aceste copii fiind șterse după terminarea executării subprogramului. Foarte important, orice modificare făcută în subprogram nu afectează variabilele originale. Acest comportament ne amintește de variabilele locale.
#include <iostream>
using namespace std;
void dubleaza(int x) {
x = x * 2;
cout << "In functie: " << x << "\n";
}
int main() {
int a = 10;
dubleaza(a);
cout << "Dupa executie: " << a << "\n";
}
In functie: 20
Dupa executie: 10
Fiind parametru transmis prin valoare, modificarea din subprogram s-a făcut pe copie, nu pe original.
Transmiterea prin referință („adresă”)
Deseori denumită „transmitere prin adresă”, denumirea corectă pentru parametrii prefixați de simbolul & este de „parametri transmiși prin referință”.
La transmiterea prin referință, se transmite adresa variabilei, nu o copie. Astfel, orice modificare asupra parametrului formal va modifica direct variabila originală.
Transmiterea prin referință se face adăugând semnul & între tipul de dată și numele parametrului.
#include <iostream>
using namespace std;
void dubleaza(int& x) {
x = x * 2;
cout << "In functie: " << x << "\n";
}
int main() {
int a = 10;
dubleaza(a);
cout << "Dupa executie: " << a << "\n";
return 0;
}
In functie: 20
Dupa executie: 20
Particularitatea transmiterii tablourilor
În C++, vectorii (tablourile) se transmit automat prin referință, chiar dacă nu folosim simbolul & în antetul funcției.
Din acest motiv, modificările făcute în funcție afectează și tabloul original folosit la apelare.
#include <iostream>
using namespace std;
void dubleazaElemente(int v[], int n) {
for(int i = 0; i < n; i++)
v[i] *= 2;
}
int main() {
int A[5] = {1, 2, 3, 4, 5};
dubleazaElemente(A, 5);
for(int i = 0; i < 5; i++)
cout << A[i] << " ";
return 0;
}
2 4 6 8 10
Chiar dacă în antet apare simplu int v[], vectorul este transmis prin adresă, iar modificările făcute se păstrează și după ieșirea din subprogram.
În antetul funcției putem furniza un tablou folosind oricare dintre: int v[], int v[100], sau int* v; toate au același efect.
Chiar dacă precizarea explicită a dimensiunii tablourilor nu este obligatorie, ea este recomandată.