Reparto regular vs. Reparto_estático vs. Reparto_dinámico

Llevo casi veinte años escribiendo código en C y C++, pero hay un aspecto de estos lenguajes que nunca he entendido bien. Evidentemente, he utilizado los lanzamientos regulares, es decir

MyClass *m = (MyClass *)ptr;

por todas partes, pero parece que hay otros dos tipos de calcos, y no sé la diferencia. ¿Cuál es la diferencia entre las siguientes líneas de código?

MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);

Deberías consultar el artículo Programación C++/Configuración de tipos.

Contiene una buena descripción de todos los diferentes tipos de fundición. Lo siguiente está tomado del enlace anterior:

const_cast

const_cast(expresión) El const_cast() se utiliza para añadir/quitar const(ness) (o volatile-ness) de una variable.

static_cast

static_cast(expresión) La función static_cast() se utiliza para cambiar entre los tipos enteros. Por ejemplo, char->long, int->short, etc.

El casting estático también se utiliza para lanzar punteros a tipos relacionados, por por ejemplo, para convertir void* en el tipo apropiado.

dynamic_cast

El casting dinámico se utiliza para convertir punteros y referencias en tiempo de ejecución, generalmente con el propósito de convertir un puntero o referencia hacia arriba o hacia abajo una cadena de herencia (jerarquía de herencia).

dynamic_cast(expresión)

El tipo de destino debe ser un puntero o referencia, y la expresión debe evaluarse a un puntero o referencia. expresión debe evaluarse a un puntero o referencia. El casting dinámico sólo funciona sólo cuando el tipo de objeto al que se refiere la expresión es compatible con el tipo de destino y la clase base tiene al menos una función función miembro virtual. Si no es así, y el tipo de expresión que se está lanzando es un puntero, NULL. es un puntero, se devuelve NULL, si falla un casting dinámico sobre una referencia falla, se lanza una excepción bad_cast. Cuando no falla, el casting dinámico devuelve un puntero o una referencia. Cuando no falla, la conversión dinámica devuelve un puntero o una referencia del tipo de destino al objeto al que se refiere la expresión.

reinterpretar_cast

Reinterpret cast simplemente convierte un tipo en otro. Cualquier puntero o tipo integral puede ser lanzado a cualquier otro con reinterpret cast, permitiendo fácilmente un mal uso. Por ejemplo, con el reinterpret cast uno podría, de forma insegura, convertir un puntero entero en un puntero de cadena.

Comentarios (0)

Los moldes de estilo C confunden const_cast, static_cast y reinterpret_cast.

Desearía que C++ no tuviera casts al estilo de C. Los casts de C++ destacan adecuadamente (como deberían; los casts son normalmente indicativos de que se está haciendo algo malo) y distinguen adecuadamente entre los diferentes tipos de conversión que realizan los casts. También permiten que se escriban funciones de aspecto similar, por ejemplo, boost::lexical_cast, lo que es bastante bueno desde la perspectiva de la consistencia.

Comentarios (0)

El operador dynamic_cast tiene comprobación de tipo en tiempo de ejecución y sólo funciona con referencias y punteros, mientras que static_cast no ofrece comprobación de tipo en tiempo de ejecución. Para obtener información completa, consulte el artículo de MSDN static_cast Operator.

Comentarios (0)