[C con Clase] referencias en el ejemplo de clase "pareja"

Steven Davidson srd4121 en njit.edu
Jue Mar 5 19:47:20 CET 2009


Hola Vicente,

vicente lozano wrote:
> Buenos dias!
> 
> Estoy mirando ahora mismo el ejemplo "pareja" 
> <http://c.conclase.net/curso/index.php?cap=028> del curso de C++. 
> (http://c.conclase.net/curso/index.php?cap=028)
> 
> En el mismo la funcion Lee que se declara en el exterior de la clase 
> tiene el siguiente prototipo:
> 
> void pareja::Lee(int &a2, int &b2);
> 
> 
> Mi pregunta es porque se usan unas referencias alli en lugar de unos
> punteros, tiene alguna ventaja hacerlo asi? Es obligatorio si la
> funcion es declarada fuera de la clase? Lo digo porque creo recordar
> que lei por ahi que:
> Si la funcion no modifica las variables -> se pasa por valor
> Si la funcion modifica las variables -> se pasa un puntero
> Si la funcion no modifica las variables pero son muy grandes y no se
> quiere pasar una copia por motivos de eficiencia -> se pasa por
> referencia
> 
> Y en parte le veo razon a eso, ya que asi al leer la llamada de la 
> funcion, si ves que estas pasando una direccion es que vas a 
> modificarlo, en cambio si es por referencia como el cambio lo hace 
> automatico puede hacer el codigo menos claro.
> 

En general, esto es cierto. En el caso de 'pareja::Lee()', elegimos 
referencias porque se sobrentiende que estamos "leyendo desde este 
objeto y guardando a los parámetros". Esto suele ocurrir al diseñar 
funciones que modifican como las de lectura. También puedes ver lo mismo 
en las funciones de intercambio como:

void intercambio( int &a, int &b );
...
int mayor, menor;
...
intercambio( mayor, menor );

Se infiere que los parámetros serán modificados por la "naturaleza" de 
la funcionalidad, que en este caso se trata de intercambiar los valores 
de dos variables entre sí.

En otros casos, no es aconsejable ser imperceptible y por ello se suele 
elegir aceptar punteros. Por ejemplo,

bool enviar( int *pID, const char *pBufer, int nTamanno );
...
char cbDatos[256];
int nID;
...
if( !enviar( &nID, cbDatos, 256 ) )
{
   cerr << "ERROR: envío" << endl;
   exit(1);
}

Por supuesto que podíamos haber pasado 'nID' por referencia, pero es 
demasiado imperceptible si nos centramos en la legibilidad del código 
fuente, ya que nos parecería pasar el parámetro por copia (o por valor).

Aunque estemos hablando más bien del diseño del estilo, espero que quede 
claro que 'cbDatos' debe ser pasado como puntero, porque estamos pasando 
el comienzo de varios datos consecutivos como un bloque.


Espero haber aclarado la duda.

Steven





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