Cum se transmit argumente la funcții în C++: prin valoare vs. prin referință?

Cum Se Transmit Argumente La Functii In C Prin Valoare Vs Prin Referinta



Orice limbaj de programare, inclusiv C++, trebuie să aibă capacitatea de a furniza parametri funcțiilor. De valoare și prin referinţă sunt cele două metode principale care pot fi folosite pentru a trece parametri. Ambele abordări au avantaje și dezavantaje, așa că este esențial pentru programatori să știe când să le folosească pe fiecare.

1: Trecerea argumentelor după valoare

Se face o copie a variabilei și se furnizează funcției când argumentele sunt transmise după valoare . Toate modificările aduse variabilei în interiorul funcției afectează doar copia; nu se modifică nimic față de variabila inițială. Ca urmare, trecând prin valoare este o metodă sigură deoarece nu există posibilitatea de a modifica neintenționat valoarea variabilei originale.

Trecând prin valoare , cu toate acestea, ar putea fi ineficiente, mai ales atunci când aveți de-a face cu tipuri de date mari sau complicate. Fiecare apel de funcție care necesită o copie a datelor poate epuiza rapid resursele CPU și memorie. În plus, trecând prin valoare nu poate fi utilizat pentru funcții care urmăresc modificarea valorii variabilei originale, deoarece copia și variabila originală nu sunt legate.







2: Trecerea argumentelor prin referință

Variabilele pot fi trecut prin referință și în C++, ceea ce ajută la rezolvarea acestor probleme. Variabila originală este trimisă la funcția când trecând prin referinţă , iar orice modificare efectuată variabilei din interiorul funcției va afecta și variabila originală. Din acest motiv, trecând prin referinţă este substanțial mai eficient pentru tipurile de date mari sau complicate și evită necesitatea copierii.



Pentru a preveni modificările neintenționate, o funcție trebuie desemnată în mod explicit ca const. Adăugarea cuvântului cheie const la declarația funcției, ca în „int calculate(const int& a, const int& b)” va realiza acest lucru.



In orice caz, transmiterea argumentelor prin referință necesită o atenție deosebită și la detalii. Programatorii neexperimentați pot face greșeli, cum ar fi crearea de efecte secundare neintenționate, partajarea neintenționată a datelor și anularea datelor externe.





Luați în considerare următorul cod care demonstrează ambele metode de trecere a argumentelor :

#include

folosind namespace std ;

gol PassByValue ( int X ) {

X = 5 ;

cout << „În interiorul PassByValue: ” << X << endl ;

}

gol PassByReference ( int & X ) {

X = 5 ;

cout << „În interiorul PassByReference:” << X << endl ;

}

int principal ( ) {

int num1 = 2 , num2 = 2 ;

cout << 'Înainte de apeluri de funcție: num1= ' << num1 << ' num2 = ' << num2 << endl ;

PassByValue ( num1 ) ;

PassByReference ( num2 ) ;

cout << 'După apelurile de funcție: num1= ' << num1 << ' num2 = ' << num2 << endl ;

întoarcere 0 ;

}

În codul de mai sus, prima funcție, PassByValue , primește un argument întreg după valoare. În cadrul funcției, o nouă variabilă întreg este creată și i se atribuie valoarea 5. Numărul întreg original rămâne nemodificat. A doua functie, PassByReference , primește un argument întreg prin referință. În acest caz, funcția manipulează direct variabila originală.



Ieșire

După cum era de așteptat, primul apel iese 5, dar nu are niciun efect asupra variabilei inițiale. În schimb, al doilea apel modifică valoarea lui num2 la 5, ceea ce afectează rezultatul declarației finale.

Treci după valoare vs. Treci după referință

1: Mod de a apela o funcție

O diferență între trecând prin valoare și trecând prin referinţă așa este numită funcția. Când trecând prin valoare , apelul funcției trebuie să includă valoarea variabilei, cum ar fi `calculate(a, b)`. Când trecând prin referinţă , apelul funcției trebuie să includă adresa de memorie a variabilei, simbolizată printr-un caracter ampersand, cum ar fi `calculate(&a, &b)`.

2: Tipuri de date

În general, trecând prin valoare este cel mai potrivit atunci când lucrați cu tipuri de date mici sau simple sau când funcția nu are scopul de a modifica variabila originală. Trecând prin referință este mai potrivit pentru tipurile de date mari sau complexe sau atunci când funcția este destinată să modifice valoarea variabilei originale.

Concluzie

Când parametrii sunt trecut prin valoare unei funcții, o copie a variabilei este creată și furnizată. De trecând prin referinţă , variabila originală este trimisă funcției. În C++, transmiterea argumentelor după valoare sau prin referință este un concept fundamental. Alegerea abordării potrivite depinde de circumstanțele specifice și trebuie evaluată cu atenție. Beneficiile utilizării referinţă abordarea poate duce la un cod mai eficient, în ciuda tentației de a utiliza mai ușor trecând prin valoare metodă.