(Consulta) Operador const_cast

Iniciado por class_OpenGL, 30 Noviembre 2015, 08:29 AM

0 Miembros y 1 Visitante están viendo este tema.

class_OpenGL

(Aquí cuento un poco como he llegado a mi duda, puedes leer un resumen abajo)

Hola, muy buenas. El caso es que acabo de encontrarme con este operador, el cual me parece un tanto curioso. Bueno, supongo que cada uno, cuando ha visto este operador, se ha hecho la pregunta ¿podré modificar el valor de una constante? Bueno, pues para probarlo, he elaborado el siguiente código:

Código (cpp) [Seleccionar]
#include <iostream>

int main() {
   const int value_a = 5;
   int *value_b = NULL;

   value_b = const_cast<int *>(&value_a);
   *value_b = 6;

   std::cout << "&value_a = " << &value_a << std::endl; // Imprimimos direcciones
   std::cout << " value_b = " << value_b << std::endl;
   std::cout << std::endl;
   std::cout << " value_a = " << value_a << std::endl; // Imprimimos valores
   std::cout << "*value_b = " << *value_b;

   std::cin.get();
   return 0;
}


El resultado que he obtenido, es cuanto menos curioso:
Citar&value_a = 0x9ffe34
value_b = 0x9ffe34

value_a = 5
*value_b = 6

Bueno, analicemos. Las dos variables, efectivamente, tienen la misma dirección (así que el casting parece haberse computado correctamente). La cosa es que para dos mismas direcciones de dos variables, ¡tenemos dos valores diferentes!

La duda, en resumidas cuentas es, ¿cómo es posible que para una misma dirección de memoria haya dos valores diferentes almacenados? ¿o a lo mejor sucede otra cosa?

Gracias :D

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

Es evidente que una idrección de memoria no guarda dos valores. El compilador se encarga de gestionar ahí el valor de la variable const.
La palabra const tiene una finalidad.

Si quieres que el compilador no haga estas mejoras, coloca la palabra "volatile" delante de la variable const, para decirle al compilador que esa variable puede cambiar.

class_OpenGL

No lo entiendo. Las dos variables apuntan a la misma dirección. ¿Es que la memoria RAM se puede dividir en fragmentos? Gracias

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

#3
El compilador no utiliza la dirección para sacar el valor. Lo da directamente. Es otro concepto.

Coge un editor de memoria como OllyDBG o Cheat Engine, y fíjate en los accesos a la dirección de memoria. Verás cómo trabaja.

En definitiva, el compilador no trabaja en ese momento con esa dirección de memoria.

De todos modos, const se utiliza si no vas a modificar el valor, tenlo en cuenta.

class_OpenGL

Cita de: ivancea96El compilador no utiliza la dirección para sacar el valor. Lo da directamente. Es otro concepto.

Eso es extraño, pero de acuerdo (supongo que se podría entender mejor si supiera ensamblador :S)

Gracias por tu respuesta :D

PD.:

Cita de: ivancea96De todos modos, const se utiliza si no vas a modificar el valor, tenlo en cuenta.

También es verdad xD Solo tenía curiosidad!

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL