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

vicente lozano vicentelozano en gmail.com
Vie Mar 6 09:37:53 CET 2009


Si, 100% aclarada, gracias.

2009/3/5 Steven Davidson <srd4121 en njit.edu>

> 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
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090306/7199c92b/attachment.html>


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