Tutorial de C++ Instituto Tecnológico de Costa Rica
[Índice][Previo][Siguiente]

Referencias

Además de la declaración normal de variables, C++ permite que se declaren referencias como sinónimos de variables:

  #include <iostream.h>
  main()
  {
   int numero = 12;
   int &ref = numero;    cout << "número tiene el valor:" << numero << '\n';
   numero = 17;
   cout << "ref tiene el valor:" << ref << '\n';
  }

que produce la siguiente salida por pantalla:

número tiene el valor:12
ref tiene el valor:17

En este ejemplo, ref es una referencia a un entero, numero. Por tanto, ambos ocupan la misma localización de memoria. La referencia ref se convierte en sinónimo de la variable numero. Las dos operaciones:

numero ++;
ref ++;

tienen el mismo efecto.
Cuando se declara, una referencia debe ser siempre inicializada para referenciar a una variable. En caso contrario, el compilador dará error. Después de su inicialización, la referencia no puede cambiarse para referenciar a otra variable.

La forma en que el compilador de C++ implementa las referencias es usando punteros internamente, es decir, las referencias en C++ son punteros ordinarios en lo que concierne al compilador. Sin embargo, el programador no ha de preocuparse por ello.

Las principales diferencias entre punteros y referencias son:

  • Una referencia no puede existir por sí misma, es decir, sin algo a lo que referirse. La declaración de una referencia de la forma:
                   int &ref;

    no está permitida. Excepciones a esta regla son las referencias declaradas external (se supone que estas referencias se han inicializado en alguna otra parte), referencias como argumentos de funciones (la llamada inicializa la referencia), referencias como tipo devueltos por funciones (la función determina a qué se referirá el valor devuelto) y referencias como miembros de clases. En cambio, los punteros son variables por sí mismas: apuntan, bien a algo concreto, o a 'nada'.
  • Excepto para el caso de referencias como tipo devuelto por funciones, las referencias son alias para otras variables y no pueden ser redefinidas como sinónimos de otra variable. Una vez que se ha definido una referencia, se refiere siempre a su variable particular. En cambio, los punteros pueden ser reasignados para apuntar a variables diferentes.
  • Cuando se utiliza el operador dirección & sobre una referencia, se obtiene la dirección de la variable a la que la referencia se refiere. En cambio, los punteros ordinarios son variables, por lo que la dirección de una variable puntero no es la dirección de la variable a la que apunta.
Brokken y Kubat recomiendan:

  • Cuando la función llamada no altera sus argumentos, se debe pasar una copia de la variable.
  • Cuando una función cambia el valor de sus argumentos, se debe pasar la dirección, a través de punteros.
  • Las referencias se reservan para aquellos casos en los que la función no cambiará sus argumentos, pero en los que es deseable pasar una referencia (es decir, un puntero) a la variable en lugar de una copia de la variable. Esto ocurre cuando una variable grande, (una estructura o una clase) se pasa como argumento.
Las referencias pueden conducir a código poco elegante. Una función puede devolver una referencia a una variable, como en el siguiente ejemplo:

   int &func (void)
   {
     int value;
     return (value);
   }
Esto permite las siguientes utilizaciones:

   func () = 20;
   func () + = func();
Tales construcciones deben evitarse.

[Índice][Previo][Siguiente]

Free Web Hosting