Vous êtes sur la page 1sur 3

Paso por valor o referencia

Hasta ahora siempre hemos declarado los parmetros de nuestras funciones del mismo
modo. Sin embargo, ste no es el nico modo que existe para pasar parmetros.

La forma en que hemos declarado y pasado los parmetros de las funciones hasta
ahora es la que normalmente se conoce como "por valor". Esto quiere decir que cuando
el control pasa a la funcin, los valores de los parmetros en la llamada se copian a
"objetos" locales de la funcin, estos "objetos" son de hecho los propios parmetros.

#include <iostream>
using namespace std;

int funcion(int n, int m);

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

cout << "a,b ->" << a << ", " << b << endl;
cout << "funcion(a,b) ->"
<< funcion(a, b) << endl;
cout << "a,b ->" << a << ", " << b << endl;
cout << "funcion(10,20) ->"
<< funcion(10, 20) << endl;

return 0;
}

int funcion(int n, int m) {


n = n + 2;
m = m - 5;
return n+m;
}

Bien, qu es lo que pasa en este ejemplo?


Empezamos haciendo a = 10 y b = 20, despus llamamos a la funcin
"funcion" con las objetos a y b como parmetros. Dentro de "funcion"
esos parmetros se llaman n y m, y sus valores son modificados. Sin
embargo al retornar a main, a y b conservan sus valores originales. Por
qu?
La respuesta es que lo que pasamos no son los objetos a y b, sino que
copiamos sus valores a los objetos n y m.
Piensa, por ejemplo, en lo que pasa cuando llamamos a la funcin con
parmetros constantes, es lo que pasa en la segunda llamada a
"funcion". Los valores de los parmetros no pueden cambiar al retornar
de "funcion", ya que esos valores son constantes.
Si los parmetros por valor no funcionasen as, no sera posible llamar a
una funcin con valores constantes o literales.

Referencias a objetos
^

Las referencias sirven para definir "alias" o nombres alternativos para un


mismo objeto. Para ello se usa el operador de referencia (&).
Sintaxis:

<tipo> &<alias> = <objeto de referencia>


<tipo> &<alias>

La primera forma es la que se usa para declarar objetos que son


referencias, la asignacin es obligatoria ya que no pueden definirse
referencias indeterminadas.
La segunda forma es la que se usa para definir parmetros por
referencia en funciones, en estos casos, las asignaciones son implcitas.
Ejemplo:

#include <iostream>
using namespace std;

int main() {
int a;
int &r = a;

a = 10;
cout << r << endl;

return 0;
}

En este ejemplo los identificadores a y r se refieren al mismo objeto,


cualquier cambio en una de ellos se produce en el otro, ya que son, de
hecho, el mismo objeto.
El compilador mantiene una tabla en la que se hace corresponder una
direccin de memoria para cada identificador de objeto. A cada nuevo
objeto declarado se le reserva un espacio de memoria y se almacena su
direccin. En el caso de las referencias, se omite ese paso, y se asigna la
direccin de otro objeto que ya exista previamente.
De ese modo, podemos tener varios identificadores que hacen referencia
al mismo objeto, pero sin usar punteros.
Pasando parmetros por referencia
^

Si queremos que los cambios realizados en los parmetros dentro de la


funcin se conserven al retornar de la llamada, deberemos pasarlos por
referencia. Esto se hace
declarando los parmetros de la funcin como referencias a objetos. Por
ejemplo:

#include <iostream>
using namespace std;

int funcion(int &n, int &m);

int main() {
int a, b;

a = 10; b = 20;
cout << "a,b ->" << a << ", " << b << endl;
cout << "funcion(a,b) ->" << funcion(a, b) << endl;
cout << "a,b ->" << a << ", " << b << endl;
/* cout << "funcion(10,20) ->"
<< funcion(10, 20) << endl; // (1)
es ilegal pasar constantes como parmetros cuando
estos son referencias */

return 0;
}

int funcion(int &n, int &m) {


n = n + 2;
m = m - 5;
return n+m;
}

En este caso, los objetos "a" y "b" tendrn valores distintos despus de
llamar a la funcin. Cualquier cambio de valor que realicemos en los
parmetros dentro de la funcin, se har tambin en los objetos
referenciadas.
Esto quiere decir que no podremos llamar a la funcin con parmetros
constantes, como se indica en (1), ya que aunque es posible definir
referencias a constantes, en este ejemplo, la funcin tiene como
parmetros referencias a objetos variables.
Y si bien es posible hacer un casting implcito de un objeto variable a
uno constante, no es posible hacerlo en el sentido inverso. Un objeto
constante no puede tratarse como objeto variable.

Vous aimerez peut-être aussi