Paso de Variables por Referencia y por Valor en C++

cpp c++ variables referencia valor

En C++ se pueden pasar argumentos por valor o por referencia a la hora de llamar una función o un método de una clase, cuando pasamos argumentos por valor lo que sucede es que se realiza una copia de los valores que se envían a la función y de esta forma los valores originales permanecen inalterados, por ejemplo, si tenemos una función intercambiar( ) que recibe dos números enteros y los ‘intercambia’ literalmente, es decir, el contenido de a pasa hacia b y viceversa, si se tiene el siguiente programa:

#include <iostream>

using namespace std;

void intercambiar(int, int); //Protipo de la función para intercambiar los valores

int main(void)
{
    int a = 2,b = 3;
    cout<<"Valores originales  a = "<<a<<" y b = "<<b<<endl<<endl;
    intercambiar(a,b); //Llmado a la función intercambiar
    cout<<"Luego de la funcion a = "<<a<<" y b = "<<b<<endl<<endl;

    return 0;
}

void intercambiar(int i, int j)
{
    int z;
    z = i;
    i = j;
    j = z;
}

Y al compilar y ejecutar el código anterior lo que se obtiene en pantalla son los valores que contienen las variables principales.

valores referencia cpp c++

Cuando se imprime el valor de las variables ab se observa que de hecho no fueron alteradas después de la llamada a la función intercambiar( ), esto se debe a que en realidad lo que le pasamos a la función fue una copia de los valores de las variables ab, por lo tanto era de esperar que las copias se cambiaran pero que finalmente los elementos originales permanecieran intactos.

Por otro lado, cuando se pasan valores por referencia, no se pasa una copia de los valores originales, sino que se crea (cómo su nombre lo india) una referencia que tiene la misma dirección en memoria del elemento original, esto quiere decir dos cosas, en primer lugar la variable con la cual se trabajará al interior de la función que recibe la referencia será por definición un sinónimo de la variable original, esto quiere decir que será idéntica y cuanto a la dirección de memoria, su contenido, etc; Por otro lado esto quiere decir que cualquier modificación que hagamos en la función al contenido de la referencia afectará de forma inmediata a las variables originales.

Para pasar valores por referencia a una función, solo se debe anteponer el símbolo & (ampersand) en el nombre de la variable que será la referencia de las variables originales, es decir, el prototipo de la nueva función intercambiar( ) que ahora trabaja con referencias, será:

void intercambiar(int &i , int &j ); //Protipo de la función para intercambiar los valores

Luego si solo agregamos este operador (el & se conoce también como operador de referencia), al programa anterior tal como se muestra a continuación, el uso de las variables será común y corriente, sin embargo cualquier cambio que se realice en ellas afectará directamente a las variables en el programa principal (función main( )), si compilamos y ejecutamos el siguiente código.

#include <iostream>

using namespace std;

void intercambiar(int &i , int &j ); //Protipo de la función para intercambiar los valores

int main(void)
{
    int a = 2,b = 3;
    cout<<"Valores originales  a = "<<a<<" y b = "<<b<<endl<<endl;
    intercambiar(a,b); //Llmado a la función intercambiar
    cout<<"Luego de la funcion a = "<<a<<" y b = "<<b<<endl<<endl;

    return 0;
}

void intercambiar(int &i, int &j)
{
    int z;
    z = i;
    i = j;
    j = z;
}

El resultado obtenido será el siguiente:

valores referencia variable c++ cpp

Entonces se puede notar como en esta ocasión si se vio afectado el contenido de las variablesoriginales” (aunque finalmente no está del todo bien decir originales ya que como habíamos comentado, en el fondo, las variables son las mismas al compartir la misma dirección en memoria).

Si estabas pensando que sucede a la hora de trabajar con arrays, pues en ese caso debemos trabajar con punteros, que aunque es bastante fácil y no es mucha la diferencia, abordaremos ese tema más adelante, por ahora solo vemos como pasar variables de cualquier tipo, incluso si son objetos o variables definidas por el usuario.

Hasta aquí este artículo, espero que te haya sido útil, y si crees que esta información puede resultar útil para alguien más, ayúdanos a compartirla.

Saludos.


Autor: Julio E. Marulanda.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s