Mecanismul de Transmitere a Datelor prin Parametrii în C++ 12
1. Obiectivele lecției:
- Să înțeleagă conceptul de parametri formali și actuali.
- Să exploreze metodele de transmitere a datelor: prin valoare, prin referință și prin adresă.
- Să implementeze exemple practice pentru fiecare tip de apel.
2. Parametrii formali și parametrii actuali
- Parametrii formali:
- Variabilele declarate în lista de parametri a funcției.
- Reprezintă datele de intrare așteptate de funcție.
- Există doar pe durata execuției funcției.
Exemplu:
void afiseazaSuma(int a, int b) { // a și b sunt parametri formali
cout << „Suma este: ” << a + b << endl;
}
- Parametrii actuali:
- Valorile sau variabilele transmise funcției în momentul apelului.
- Se asociază cu parametrii formali.
Exemplu:
int main() {
afiseazaSuma(3, 5); // 3 și 5 sunt parametri actuali
return 0;
}
3. Metode de transmitere a parametrilor
1. Apel prin valoare
- Definiție:
- Parametrul formal primește o copie a valorii parametrului actual.
- Modificările asupra parametrului formal nu afectează parametrul actual.
- Exemplu:
void modificaValoare(int x) {
x = 10; // Parametrul actual nu este afectat
}
int main() {
int numar = 5;
modificaValoare(numar);
cout << „Valoarea lui numar: ” << numar << endl; // Afișează 5
return 0;
}
- Avantaje:
- Simplu de utilizat.
- Parametrul actual rămâne neschimbat.
- Dezavantaje:
- Ineficient pentru tipuri mari de date (copierea consumă timp și memorie).
2. Apel prin referință
- Definiție:
- Parametrul formal devine un alias pentru parametrul actual.
- Modificările asupra parametrului formal afectează direct parametrul actual.
- Exemplu:
void modificaReferinta(int& x) {
x = 10; // Parametrul actual este modificat
}
int main() {
int numar = 5;
modificaReferinta(numar);
cout << „Valoarea lui numar: ” << numar << endl; // Afișează 10
return 0;
}
- Avantaje:
- Eficient (nu se face copiere).
- Permite modificarea valorii originale.
- Dezavantaje:
- Poate duce la erori dacă modificările sunt nedorite.
3. Apel prin adresă
- Definiție:
- Parametrul formal primește adresa parametrului actual.
- Accesul și modificarea se fac prin dereferențiere.
- Exemplu:
void modificaAdresa(int* x) {
*x = 10; // Parametrul actual este modificat
}
int main() {
int numar = 5;
modificaAdresa(&numar); // Transmite adresa lui numar
cout << „Valoarea lui numar: ” << numar << endl; // Afișează 10
return 0;
}
- Avantaje:
- Eficient și flexibil (permite modificări și acces la memoria parametrului actual).
- Dezavantaje:
- Sintaxa mai complicată.
- Necesită atenție pentru a evita erorile legate de pointeri.
4. Compararea metodelor de transmitere
Caracteristică | Apel prin valoare | Apel prin referință | Apel prin adresă |
Modificarea parametrului actual | Nu | Da | Da |
Eficiență pentru tipuri mari | Scăzută | Ridicată | Ridicată |
Simplitate | Simplă | Moderată | Mai complicată |
5. Exemple practice
Exemplu 1: Schimbarea valorilor a două variabile
- Prin referință:
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
swap(x, y);
cout << „x: ” << x << „, y: ” << y << endl; // x: 10, y: 5
return 0;
}
- Prin adresă:
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y);
cout << „x: ” << x << „, y: ” << y << endl; // x: 10, y: 5
return 0;
}
Exemplu 2: Calcularea sumei elementelor unui vector
- Prin referință:
int suma(const int& a, const int& b) {
return a + b;
}
int main() {
int x = 5, y = 10;
cout << „Suma: ” << suma(x, y) << endl; // Suma: 15
return 0;
}
6. Activități practice pentru elevi
- Scrieți un program care folosește apelul prin referință pentru a tripla valoarea unei variabile.
- Implementați o funcție care folosește apelul prin adresă pentru a calcula produsul a două numere.
- Realizați un program care calculează suma elementelor unui vector, folosind apelul prin valoare și prin referință.
7. Scheme logice
- Apel prin valoare:
- Start -> Transmite copie -> Modifică copia -> Nu afectează originalul -> Stop.
- Apel prin referință:
- Start -> Transmite referință -> Modifică variabila originală -> Stop.
- Apel prin adresă:
- Start -> Transmite adresa -> Dereferențiere și modificare -> Stop.
8. Concluzie
- Alegerea metodei de transmitere a parametrilor depinde de cerințele programului:
- Prin valoare: Pentru date care nu trebuie modificate și sunt mici.
- Prin referință: Pentru date mari care necesită modificări.
- Prin adresă: Pentru cazuri complexe care implică acces la locația memoriei.
- Practica este esențială pentru a înțelege și aplica corect fiecare metodă.