dilluns, 26 de maig del 2008

PARÀMETRES PER VALOR I PER REFERÈNCIA

Una funció/acció pot o no rebre paràmetres per executar les seves instruccions. En l’exemple anterior, l’acció salutacio() no necessita cap paràmetre per executar-se. Però en canvi, haguéssim pogut passar els dos nombres a la funció d’aquesta manera:


void suma(int a, int b);

void main()
{
int a;
int b;

cout<<"a: "; cin>>a;
cout<<"b: "; cin>>b;

suma(a, b);
}

void suma(int a, int b)
{
int resultat;
resultat=a+b;
}


I d’això és diu pas de paràmetres per valor i això vol dir que quan el control passa a la funció, els valors del paràmetres de la crida es copien a “variables” locals de la funció i per tant no queden alterades al sortir de la funció.
També es poden passar valors per referència, on les instruccions de la funció operen directament amb els arguments que se’ls hi passa i per tant els canvis que s’hi facin sobre les dades persistiran després de l’execució de a funció. Ho veurem millor amb un altre exemple:


void funcio(int n, int m);


void main()
{
int a=10;
int b=20;
}


void funcio(int n, int m)
{
n=n+5;
m=m+5;
}


En l’exemple anterior, declarem les variables a i b i cridem a la acció “funció” amb aquests paràmetres. A dins els paràmetres es diuen n i m i canviem el seu valor, però malgrat això, al retornar a la funció main, a i b conserven els seus valors originals, perquè no pasem a l’acció “funcio” les variables a i b si no còpies dels seus valors a les variables n i m.

Si volem que els canvis realitzats als paràmetres dins de la funció es conservin al retornar la crida, els hem de passar per referència, declarant l’acció “funcio” amb paràmetres que els passarem per referència. Per fer-ho utilitzem l’operador (&):


void funcio(int &n, int &m);

void main()
{
int a=10;
int b=20;

funcio(a, b);
}

void funcio(int &n, int &m)
{
n=n+5;
m=m+5;
}


Ara en canvi un cop cridem a l’acció “funció” tot i que treballem també amb còpies dels valors, aquests es tornen a copiar al sortir de la funció, mantenint els canvis dins de la funció al main.

ATENCIÓ: Si en una funció/acció es passa una cadena, aquesta sempre s’haurà de passar per valor, malgrat ell la tracti sempre com si es passes per referència.