Si, 100% aclarada, gracias.<br><br><div class="gmail_quote">2009/3/5 Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola Vicente,<br>
<br>
vicente lozano wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Buenos dias!<br>
<br>
Estoy mirando ahora mismo el ejemplo "pareja" <<a href="http://c.conclase.net/curso/index.php?cap=028" target="_blank">http://c.conclase.net/curso/index.php?cap=028</a>> del curso de C++. (<a href="http://c.conclase.net/curso/index.php?cap=028" target="_blank">http://c.conclase.net/curso/index.php?cap=028</a>)<div>
<div></div><div class="h5"><br>
<br>
En el mismo la funcion Lee que se declara en el exterior de la clase tiene el siguiente prototipo:<br>
<br>
void pareja::Lee(int &a2, int &b2);<br>
<br>
<br>
Mi pregunta es porque se usan unas referencias alli en lugar de unos<br>
punteros, tiene alguna ventaja hacerlo asi? Es obligatorio si la<br>
funcion es declarada fuera de la clase? Lo digo porque creo recordar<br>
que lei por ahi que:<br>
Si la funcion no modifica las variables -> se pasa por valor<br>
Si la funcion modifica las variables -> se pasa un puntero<br>
Si la funcion no modifica las variables pero son muy grandes y no se<br>
quiere pasar una copia por motivos de eficiencia -> se pasa por<br>
referencia<br>
<br>
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.<br>

<br>
</div></div></blockquote>
<br>
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:<br>

<br>
void intercambio( int &a, int &b );<br>
...<br>
int mayor, menor;<br>
...<br>
intercambio( mayor, menor );<br>
<br>
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í.<br>
<br>
En otros casos, no es aconsejable ser imperceptible y por ello se suele elegir aceptar punteros. Por ejemplo,<br>
<br>
bool enviar( int *pID, const char *pBufer, int nTamanno );<br>
...<br>
char cbDatos[256];<br>
int nID;<br>
...<br>
if( !enviar( &nID, cbDatos, 256 ) )<br>
{<br>
  cerr << "ERROR: envío" << endl;<br>
  exit(1);<br>
}<br>
<br>
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).<br>

<br>
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.<br>
<br>
<br>
Espero haber aclarado la duda.<br>
<br>
Steven<br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</blockquote></div><br>