You are on page 1of 7

MIGUEL .

TOLEDO MARTNEZ

CONTENIDO DE LA LECCIN 16
USO DE REFERENCIAS EN C++
1. Introduccin 2. Parmetros de referencia como alias
2.1. Ejemplo 16.1

2 2
3

3. Variables de referencia como alias


3.1. Ejemplos 16.2, 16.3, 16.4, 16.5

4
4

4. Utilice comentarios en sus programas para explicar las referencias 5. Reglas para trabajar con referencias 6. Lo que necesita saber

6 6 7

FUNCIONES LECCIN 16

16-1

MIGUEL . TOLEDO MARTNEZ

LECCIN 16
USO DE REFERENCIAS EN C++
INTRODUCCIN Dos maneras de invocar funciones en muchos lenguajes de programacin son mediante llamada por valor y llamada por referencia. Cuando se pasa un argumento utilizando una llamada por valor, se hace una copia del argumento, la cual se pasa a la funcin llamada. Los cambios a la copia no afectan el valor de la variable original en el invocador. Con esto se evitan los efectos secundarios que tanto minan el desarrollo de sistemas de software correctos y confiables. En esta leccin presentaremos los parmetros de referencia, que son el primero de dos medios que tiene C++ para efectuar una llamada por referencia. Con una llamada por referencia, el invocador le da a la funcin llamada la capacidad de acceder directamente a la informacin del usuario y de modificarla si as lo desea. Mostraremos cmo lograr la ventaje de desempeo de una llamada por referencia mientras, de manera simultnea, se logra la ventaja de ingeniera de software de proteger contra la corrupcin a la informacin del invocador. Un parmetro de referencia es un alias de su argumento correspondiente.
Objetivos de esta leccin: Declarar e inicializar una variable de referencia dentro de su programa. Usar variables de referencia para cambiar el valor de un parmetro dentro de una funcin.

PARMETROS DE REFERENCIA COMO ALIAS Un parmetro de referencia es un alias de su argumento correspondiente. Para indicar que el parmetro de una funcin se pasa por referencia, simplemente ponga un ampersand (&) despus de la clase de datos del parmetro en el prototipo de la funcin; utilice la misma convencin al listar la clase de datos del parmetro en el encabezado de la funcin. Por ejemplo, la declaracin
int &contador

en un encabezado de funcin se leera como contador es una referencia a un int. En la llamada de funcin, basta con mencionar por nombre a la variable y sta se pasar por referencia. Despus, mencionar a la variable por su nombre de parmetro en el cuerpo de la funcin llamada, de hecho har referencia a la variable original del invocador, la cual podr ser modificada directamente en la funcin llamada. Como siempre el prototipo de la funcin debe coincidir con su encabezado.

FUNCIONES LECCIN 16

16-2

MIGUEL . TOLEDO MARTNEZ

Ejemplo 16.1
El siguiente programa, REFERENCIA.CPP, compara una llamada por valor y una llamada por referencia con parmetros de referencia. Los estilos de los argumentos de las llamadas a cuadradoPorValor() y cuadradoPorReferencia(), son idnticos, es decir, ambas variables se mencionan simplemente por su nombre. Sin revisar los prototipos de las funciones ni las definiciones de las funciones, es imposible saber, a partir de las llamadas mismas, si las funciones pueden modificar sus argumentos. No obstante, debido a que los prototipos de funcin son obligatorios, el compilador no tiene ningn problema para resolver esta ambigedad. /* El siguiente programa: REFERENCIA.CPP, hace una comparacin entre llamada por valor y llamada por referencia con referencia. */ #include <iostream.h> //Para cout y cin

int cuadradoPorValor(int); void cuadradoPorReferencia(int &); void main(void) { int x = 2, z = 4; cout << "x = " << x << " antes de cuadradoPorValor()" << endl; cout << "Valor devuelto por cuadradoPorValor(): " << cuadradoPorValor(x) << endl; cout << "x = " << x << " despus de cuadradoPorValor()" << endl << endl; cout << "z = " << z << " antes de cuadradoPorReferencia()" << endl; cuadradoPorReferencia(z); cout << "z = " << z << " despus de cuadradoPorReferencia()" << endl; }//Fin de main() int cuadradoPorValor(int a) { return a * a; }//Fin de cuadradoPorValor() void cuadradoPorReferencia(int &cRef) { cRef *= cRef; }//Fin de cuadradoPorValor()

//El argumento del invocador no se modifica

//El argumento del invocador se modifica

En otra leccin estudiaremos los apuntadores; veremos que los apuntadores permiten una forma alterna de realizar una llamada por referencia donde el estilo de la llamada indica con claridad que se trata de una llamada por referencia (as como el potencial de modificar los argumentos del invocador) Para especificar una referencia a una constante, ponga el calificador const antes de la especificacin de clase de dato en la declaracin del parmetro. Observe la colocacin de & en la lista de parmetros de la funcin cuadradoPorReferencia. Algunos programadores de C++ prefieren escribir int& cRef, en lugar de int &cRef.

FUNCIONES LECCIN 16

16-3

MIGUEL . TOLEDO MARTNEZ

VARIABLES DE REFERENCIA COMO ALIAS Las referencias tambin pueden servir como alias de otras variables de la funcin. Por ejemplo, el cdigo:
int contador = 1; int &cRef = contador; ++cRef; //Declara la variable entera contador //Crea cRef como alias de contador //Incrementa contador (utilizando su alias)

Incrementa la variable contador por medio de su alias cRef. Las variables de referencia deben inicializarse en sus declaraciones y no pueden reasignarse como alias a otras variables. Una vez que una referencia se declara como alias de otra variable, todas las operaciones efectuadas sobre dicho alias (es decir, la referencia) de hecho se realizan en la propia variable original. El alias simplemente es otro nombre de la variable. Si se toma la direccin de una referencia y se comparan las referencias, no sucede un error de sintaxis; en cambio, todas las operaciones suceden en la variable para la que la referencia es un alias. Las funciones pueden devolver referencias, pero esto puede ser peligroso. Al devolverle una referencia a una variable declarada en la funcin llamada, la variable debe estar declarada como static dentro de dicha funcin. De otra forma, la referencia es hacia una variable automtica que se descarta al terminar la funcin; se dice que tal variable esta indefinida y el comportamiento del programa ser impredecible (algunos compiladores emiten avisos cuando esto sucede) Las referencia a variables indefinidas se llaman referencias colgantes.
Ejemplo 16.2
El siguiente programa REFINI1.CPP, ilustra el hecho de que toda variable referenciada debe de ser inicializada. /* El siguiente programa: REFINI1.CPP, ilustra el hecho de que toda variable referenciada debe de ser inicializada. */ #include <iostream.h> void main(void) { int x = 3; int &y = x; //Ahora ya es un alias de x //Para cout y cin

cout << "x = " << x << endl << "y = " << y << endl << endl; y = 7; cout << "x = " << x << endl << "y = " << y << endl << endl; }//Fin de main()

FUNCIONES LECCIN 16

16-4

MIGUEL . TOLEDO MARTNEZ

Ejemplo 16.3
El siguiente programa REFINI2.CPP, ilustra el hecho de no inicializar una variable de referencia. /* El siguiente programa: REFINI2.CPP, ilustra el hecho de no inicializar una variable por referencia. */ #include <iostream.h> void main(void) { int x = 3; int &y; //Ahora ya es un alias de x //Para cout y cin

cout << "x = " << x << endl << "y = " << y << endl << endl; y = 7; cout << "x = " << x << endl << "y = " << y << endl << endl; }//Fin de main()

El compilador enviar el siguiente mensaje de error:


Reference variable y must be initialized

Ejemplo 16.4
El siguiente programa: REFVAR.CPP, despliega y altera los valores de una variable usando la variable misma o su referencia. /* El siguiente programa: REFVAR.CPP, ilustra el uso de variables de referencia */ #include <iostream.h> void main(void) { int x = 10; int &rx = x; // despliega x usando x y rx cout << "x contiene " << x << endl; cout << "x contiene (usando la referencia rx) " << rx << endl; // altera x y despliega su valor usando rx x *= 2; cout << "x contiene (usando la referencia rx) " << rx << endl; // altera rx y despliega el valor usando x rx *= 2; cout << "x contiene " << x << endl; }//Fin de main() //Para cout y cin

FUNCIONES LECCIN 16

16-5

MIGUEL . TOLEDO MARTNEZ

Ejemplo 16.5
El siguiente programa, INTCREF.CPP, utiliza referencias a dos datos de punto flotante para intercambiar sus valores. /* El siguiente programa: INTCREF.CPP, intercambia el valor entre dos variables utilizando variables de referencia. */ #include <iostream.h> //Para cout y cin

void intercambiaValores(float &a, float &b) { float temp; temp = a; a = b; b = temp; }//Fin de intercambiaValores() void main(void) { float grande float pequeno = 10000.0; = 0.00001;

intercambiaValores(grande, pequeno); cout << "Grande contiene: " << grande << endl; cout << "Pequeo contiene: " << pequeno << endl; }//Fin de main()

Como puede observar, la funcin intercambiaValores, se vuelve ms fcil de comprender.


UTILICE COMENTARIOS EN SUS PROGRAMAS PARA EXPLICAR LAS REFERENCIAS

Como las referencias dentro de una funcin no utilizan asterisco, puede pensarse que el valor de los parmetros no cambian, razn por la cual se hace necesario escribir comentarios antes y dentro de las funciones que cambian parmetros utilizando referencias. REGLAS PARA TRABAJAR CON REFERENCIAS Una referencia no es una variable. Una vez que asigna un valor a la referencia, la referencia no puede cambiar. Adems, a diferencia de los apuntadores, no puede realizar las operaciones siguientes en las referencias:
No puede obtener la direccin de la referencia utilizando el operador de direccin de C++. No puede asignarle un apuntador a una referencia. No puede comparar valores de referencias utilizando los operadores relacionales de C++. No puede realizar operaciones aritmticas con una referencia, tal como agregarle un desplazamiento. No puede cambiar una referencia.

FUNCIONES LECCIN 16

16-6

MIGUEL . TOLEDO MARTNEZ

LO QUE NECESITA SABER Antes de continuar con la siguiente leccin, asegrese de haber comprendido los siguientes conceptos:
!"C++ ofrece una forma directa de llamada por referencia, empleando parmetros de referencia. Para indicar que el parmetro de una funcin se pasa por referencia, ponga en el prototipo de funcin, despus del tipo del parmetro, un &. En la llamada de la funcin, mencione por nombre a la variable y ser pasada como una llamada por referencia. En la funcin llamada, la mencin de la variable con su nombre local en realidad hace referencia a la variable original del invocador. Por lo tanto, la funcin llamada puede modificar la variable original. !"Tambin se pueden crear parmetros de referencia para utilizarlos localmente como alias de otras variables dentro de una funcin. Las variables de referencia deben inicializarse en sus declaraciones y no se pueden reasignar como alias de otras variables. Una vez declarada una variable de referencia como alias de otra variable, todas las operaciones supuestamente efectuadas sobre el alias en realidad se llevan a cabo en la variable. !"Una referencia en C++ es un alias (o segundo nombre) al nombre de una variable. !"Para declarar una referencia, coloque el carcter ampersand (&) inmediatamente despus del tipo de variable y luego especifique el nombre de la referencia seguido por un signo igual y el nombre de la variable a la que la referencia le dar un alias. !"Una vez que asigna un valor a la referencia, no puede cambiar el valor de la misma. !"Debe de incluir comentarios antes y dentro de las funciones que utilizan referencias para cambiar el valor de un parmetro. De esta manera se asegura que otro programador que lea su programa pueda reconocer los cambios que est realizando. !"Un sobreuso de referencias puede conducir a programas poco legibles.

FUNCIONES LECCIN 16

16-7

You might also like