[C con Clase] Paso de parámetros

Salvador Pozo salvador en conclase.net
Lun Mar 3 18:26:42 CET 2014


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


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