[C con Clase] Referencias VS punteros

Salvador Pozo salvador en conclase.net
Mie Feb 10 12:45:16 CET 2010


El pasado 2010-02-10 10:28:53, Vicent Giner escribió:
 
VG> ¿Qué diferencia hay entre esto:
VG> int &leerTeclado( ... );
VG> y esto:
VG> int leerTeclado( ... );
VG> a la hora de definir/declarar una función?

Hola:

A la hora de definir o declarar la función no hay grandes diferencias.

La primera, evidentemente es añadir el operador &.

Otra diferencia es que no podemos retornar una constante o una variable local, ya que lo que debemos retornar se usará como una referencia a un entero, ese entero debe tener un ámbito tal que permita acceder al valor tanto desde la función, como desde cualquier lugar donde esa función sea invocada.

Como no sé qué pretendía Steven al declarar la función LeerTeclado como una referencia, así que usaré otro ejemplo:

----8<------
#include <iostream>

using namespace std;

int &Dato();

int main() {

    cout << Dato() << endl;
    Dato() = 233;
    cout << Dato() << endl;

    return 0;
}

int &Dato() {
    static int retval = 32;
    return retval;
}
----8<------

Las posibilidades son enormes. Se puede usar una de estas funciones, como la del ejemplo, como una variable. 

Podemos, como se ve, asignar valores a la función.

El código de la función puede validar el valor de modo que cumpla ciertas condiciones. Supongamos que usemos una de estas funciones para almacenar el valor de una fecha, podríamos añadir código a la función para que sólo se puedan almacenar fechas válidas.

Modifiquemos la función para que sólo se puedan almacenar valores entre 1 y 100:

----8<------
int &Dato() {
    static int retval = 32;
    if(retval < 1) retval = 1;
    if(retval > 100) retval = 100;

    return retval;
}
----8<------

Ahora, si asignamos un valor como en la función main anterior, fuera de ese margen, el valor se ajusta automáticamente. La salida del programa sería:

32
100

Seguro que hay muchas diferencias, sobre todo cuando se usan dentro de clases.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase