Você está na página 1de 1

Argumentos: por valor y por referencia

Existen dos formas de pasar argumentos a las funciones: por valor y por referencia. El
primero es utilizado por defecto con la declaración usual de parámetros. En el paso "por
valor", se crean copias de los argumentos pasados a la función, los cuales, junto a las
variables locales (incluyendo el posible valor devuelto), y la dirección de vuelta a la
rutina que efectúa la invocación, son pasados a la pila en la secuencia de llamada. Más
tarde, cuando termina su ejecución definitivamente, es decir, cuando el control vuelve a
la función que la invocó, toda esta información es sacada de la pila mediante la
secuencia de retorno (y se pierde). Estos procesos suponen un consumo de tiempo y
espacio (memoria), a veces considerable.

Paso por valor


Hemos visto que el paso de parámetros por valor significa que existen copias de los
argumentos formales (estas copias son variables locales de la función llamada), y que
una función no puede alterar ninguna variable de la función que la invocó.

Cuando los argumentos pasan por valor pero no hay concordancia entre el tipo de los
argumentos actuales y los argumentos formales utilizados en la declaración de la
función, entonces se produce un modelado de tipo antes de la asignación. Supongamos
el ejemplo:

void func(int x) { // definición de func. Acepta un entero


x = x * 2;
}
float f = 3.14;
func(f); // f es promovido a int antes de asignación a 'x'
// x == 6

Lo que sucede en estos casos es que la copia local f en func(x) es modificada para
hacerla coincidir con el tipo esperado por la función, mientras que el valor original (f)
permanece inalterado.

Paso por referencia


Por supuesto, C++ permite utilizar la técnica del C clásico descrita arriba, pero también
utilizar el paso de argumentos por referencia (en realidad es una variante semántica del
proceso anteriormente descrito). Para ello se utiliza el declarador de referencia &.

Las referencias presentan las ventajas de los punteros, en el sentido que permiten
modificar los valores de los objetos pasados como argumento, y de que permiten
ahorrar espacio si hay que pasar objetos muy grandes, pero no presentan los peligros
potenciales de aquellos. En caso necesario las referencias pueden declararse constantes,
indicando así que la función invocada no modificará estos valores. En estos casos, la
utilización de referencias obedece casi exclusivamente a razones de eficacia en el
mecanismo de llamada.

Você também pode gostar