[C con Clase] Paso de parámetros

User usuarioanonimomysql en gmail.com
Mar Mar 4 07:59:48 CET 2014


Muchas gracias Salvador, perfecta explicación.


El 3 de marzo de 2014, 18:26, Salvador Pozo <salvador en conclase.net>escribió:

> El pasado 2014-03-03 09:18:27, User escribió:
>
> U> Hola,
> U> El uso de "const QString& texto" como paso de parámetro tiene sentido
> para
> U> indicar que es un parámetro de entrada que no se va a modificar dentro
> de
> U> la función.
> U> ¿Tendría sentido para otros tipos como por ejemplo "bool"? Ejemplo:
> U> "const bool& cierto"
>
> Hola:
>
> En realidad, no. (Aunque todo depende de qué pretendas con esa declaración
> de parámetro).
>
> Pasar parámetros como referencias constantes tiene sentido para objetos
> que por alguna razón no se quieren pasar por copia.
>
> La norma es que los objetos pasados como parámetros que no van a ser
> modificados en una función se pasen por copia. De este modo, aunque en la
> función se intente modifiar su valor, el objeto original no se verá
> afectado por los cambios, ya que en realidad, la función trabaja con una
> copia del objeto.
>
> En el caso de QString, por ejemplo, probablemente el tamaño del objeto es
> indefinido, y posiblemente muy grande. Esto hace que pasar el objeto por
> copia sea poco adecuado, ya que requiere un uso excesivo de recursos, tanto
> en memoria como en tiempo para realizar la copia del objeto.
>
> En su lugar, es preferible pasar una referencia, y para que cualquier
> programador que consulte el código sepa que se preferíria usar un parámetro
> por copia, se hace esa referencia constante.
>
> Esto tiene algunos efectos colaterales.
>
> Uno, que ahora el compilador se asegura de que realmente el parámetro es
> constante, y generará un error si se intenta modificar el valor del
> parámetro, cosa que no pasa con los parámetros por copia.
>
> Otro, que no podrás pasar una constante literal como parámetro, ya que las
> referencias sólo pueden serlo de objetos no literales.
>
> Así, si por ejemplo declaras una función como esta:
>
> void funcion(bool cierto);
>
> En el cuerpo de la función podrás modificar el valor del parámetro, sin
> que el objeto original se vea afectado:
>
> void funcion(bool cierto) {
>    cierto=false;
> }
>
> También podrás invocar a la función con una constante o con una variable:
> funcion(true);
> bool x=false;
> funcion(x);
>
> Sin embargo, si la declaras como
> void funcion(const bool& cierto);
>
> No podrás ni siquiera intentar modificar el valor de cierto, ni tampoco
> invocar la función con un valor constante.
>
> void funcion(const bool& cierto) {
>    cierto=false; // <-- error
> }
>
> funcion(true); // <-- error
>
> Hasta pronto.
>
> --
> Salvador Pozo (Administrador)
> mailto:salvador en conclase.net
> Blog con Clase: http://blogconclase.wordpress.com
> Con Clase: http://conclase.net
> _______________________________________________
> 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/20140304/5b7aada6/attachment.html>


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