Foros del Web » Programación para mayores de 30 ;) » C/C++ »

function con retorno constante

Estas en el tema de function con retorno constante en el foro de C/C++ en Foros del Web. Código: const int funcion(void) { .... return x; } int main(void) { int a = funcion(); a++; } puede asignarse el valor de una función ...
  #1 (permalink)  
Antiguo 29/09/2016, 01:30
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 4 meses
Puntos: 0
function con retorno constante

Código:
const int funcion(void)
{
     ....
     return x;
}


int main(void)
{
       int a = funcion();
       a++;
}
puede asignarse el valor de una función constante a una varible NO constante y más tarde ser modificada?
Si se puede, ¿entonces para qué sirve poner ese const en la función?

Saludos
  #2 (permalink)  
Antiguo 29/09/2016, 02:51
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: function con retorno constante

en tu ejemplo, cuando tu haces:

Código C:
Ver original
  1. int a = funcion();

Estás haciendo una copia. El nuevo int tendrá una copia del valor retornado por funcion y es por eso que puedes modificar alegremente la variable a.

En el ejemplo que propones no es demasiado útil el uso de const. Como no has especificado lenguaje voy a asumir que estamos hablando de C++.

Una de las grandes utilidades de const es indicar que un argumento no va a ser modificado:

Código C++:
Ver original
  1. void PrintValues(const std::string& cadena);

Viendo esta firma lo que entendemos es que esa función no va a modificar la cadena que le pasemos. Simplemente va a leer información de la misma.

Por otro lado, este diseño evita errores tontos de programación, ya que si intentamos hacer una modificación en la variable el compilador nos mostrará el error:

Código C++:
Ver original
  1. void PrintValues(const std::string& cadena)
  2. {
  3.   cadena = "test"; // Error de compilación
  4.   std::cout << cadena;
  5. }

Eso sí, como hemos visto al principio, que un elemento sea const no quiere decir que no se puedan hacer copias no-const del mismo. Al fin y al cabo, al hacer una copia estamos creando un elemento nuevo a partir de otro ya existente:

Código C++:
Ver original
  1. void PrintValues(const std::string& cadena)
  2. {
  3.   std::string copia = cadena; // Copia no es const
  4.   copia = "test"; // ok
  5.   std::cout << cadena;
  6. }

Otra utilidad de const es que permite utilizar variables como si fuesen valores fijos:

Código C++:
Ver original
  1. int variable = 5;
  2. const int constante = 5;
  3.  
  4. std::array<int,variable> array1; // Error ->  no se pueden usar variables al definir un template
  5. std::array<int,constante> array2; // ok

Pero... las constantes pueden ser modificadas...

En programación puedes hacer prácticamente todo lo que quieras por peligroso que parezca. Y el mundo C/C++ es un campo de pruebas perfecto para poner todo patas arriba. Un ejemplo de ello es forzar conversiones:

Código C++:
Ver original
  1. int variable = -5;
  2. int* ptr = &variable;
  3. unsigned int* uptr = (unsigned int*)ptr;
  4. std::cout << *uptr;

Entre las conversiones que se pueden realizar están aquellas que permiten eliminar el atributo const a un objeto:

Código C++:
Ver original
  1. void PrintValues(const std::string& cadena)
  2. {
  3.   // Sintaxis propia de C++
  4.   std::const_cast<std::string&>(cadena) = "test";
  5.  
  6.   // Sintaxis heredada de C
  7.   ((std::string*)&cadena) = "test";
  8.  
  9.   std::cout << cadena;
  10. }

Entonces... ¿Qué sentido tiene usar const si puedo eliminar la protección a discrección?

En primer lugar hay que tener mucho cuidado al eliminar el atributo const a un objeto. Los objetos que "nacen" const pueden ser almacenados en una zona de memoria de solo lectura, por lo que modificar uno de estos objetos puede provocar un resultado indeterminado.

En segundo lugar, no resulta demasiado coherente, salvo contadísimas excepciones, saltarse la protección ya que complica la comprensión del código (si alguien ve que algo es constante espera que dicho elemento se comporte como tal). Bastante compleja puede llegar a ser la programación como para que andemos plantando bombas en nuestro propio camino.

Hay más material del que hablar sobre const, como comentar el uso del atributo mutable, pero ya son temas más técnicos que no conviene tener en cuenta en nivel principiante.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 29/09/2016, 03:01
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: function con retorno constante

Muchas gracias por al respuesta,

Entiendo que si un argumento es declarado como const, no va a ser modificado dentro de la función. Sin embargo, no entiendo cuando querríamos que el valor de retorno de una función sea const.

El lenguaje es C.
Cita:
const funcion(const int var1, const int var2)
  #4 (permalink)  
Antiguo 29/09/2016, 03:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: function con retorno constante

Si el valor de retorno es un tipo simple por valor no tiene demasiado sentido... ahora si devolvemos un puntero, una referencia o un objeto (estructura o clase) entonces puede ser necesario declararlo const por necesidades varias:

  • El objeto hace uso de recursos de solo lectura.
  • El objeto es compartido por varios elementos.
  • Hay mecanismos en otro lado para permitir modificar el objeto con seguridad.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: const, constante, function, int, retorno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:00.