PROGRAMMIAMO
C++ - Passaggio parametri
Passaggio dei parametri per valore

In C++ il passaggio dei parametri fra il chiamante e la funzione avviene per valore. Ciò significa in pratica che la funzione riceve solo una copia delle variabili usate nella chiamata. Consideriamo di nuovo l'esempio della funzione eleva per il calcolo dell'elevamento a potenza:

double eleva(double base, int esp)
{
double ris=1;

while (esp>0)
{
ris = ris * base;
esp--;
}

return ris;
}

La funzione decrementa la variabile esp fintantoché questa non diventa uguale a zero. Tuttavia tale azzeramento non ha nessun effetto sulla corrispondente variabile usata nel main, che continua a conservare il proprio valore:

#include <cstdlib>
#include <iostream>

using namespace std;

double eleva(double base, int esp);

int main(int argc, char *argv[])
{
double b,p;
int e;

cout<<"Inserisci il valore della base: ";
cin>>b;
cout<<"Inserisci il valore dell'esponente: ";
cin>>e;

p = eleva(b,e);

cout<<b<<" elevato a "<<e<<" = "<<p<<"\n";

system("PAUSE");
return EXIT_SUCCESS;
}

La cout evidenziata qui sopra, visualizza il valore dell'esponente e fornito dall'operatore, anche se la funzione ha azzerato la propria variabile esp. In pratica la funzione non può in alcun modo modificare il valore delle variabili che le vengono passate dal main.

Questa caratteristica delle funzioni rende impossibile per esempio della seguente funzione, la quale in teoria dovrebbe effettuare lo scambio fra il contenuto di due variabili num1 e num2:

void scambia(double num1, double num2)
{
double temp;

temp=num1;
num1=num2;
num2=temp;

}

Lo scambio avviene fra le due variabili num1 e num2 della funzione, ma ciò non ha alcun effetto sulle corrispondenti variabili del main, che continuano a conservare in ogni caso il loro valore.

 

Passaggio dei parametri per riferimento

In generale è bene che la funzione non possa modificare (magari erroneamente) il valore delle variabili di chi la chiama. In alcuni casi tuttavia si desidera effettivamente permettere alla funzione di modificare il contenuto delle variabili del chiamante. In tali casi si può usare il cosiddetto passaggio di parametri per riferimento.

Vediamo subito un esempio pratico, considerando di nuovo la funzione scambia che nella versione precedente (con passaggio per valore) come si è detto non funziona:

#include <cstdlib>
#include <iostream>

using namespace std;

void scambia(double &num1, double &num2);

int main(int argc, char *argv[])
{
double A,B;


cout<<"Inserisci il valore di A: ";
cin>>A;
cout<<"Inserisci il valore di B: ";
cin>>B;

scambia(A,B);

cout<<"A = "<<A<<" B = "<<B<<"\n";

system("PAUSE");
return EXIT_SUCCESS;
}

void scambia(double &num1, double &num2)
{
double temp;

temp=num1;
num1=num2;
num2=temp;

}

Si noti l'ampersand (&) prima dei nomi dei parametri nel prototipo e nell'intestazione della funzione. Il suo scopo è appunto quello di segnalare il fatto che i parametri devono in questo caso essere passati per riferimento e non per valore. In altre parole, le variabili num1 e num2 della funzione non sono delle semplici copie di A e B, ma sono effettivamente A e B (potete pensarle come se fossero degli pseudonimi o degli avatar): tutto ciò che viene fatto dalla funzione su num1 e num2, si ripercuote immediatamente sul valore di A e B, le quali vengono effettivamente scambiate fra loro.

 

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it