[Í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]
|