cpp-static-dynamic-const-cast

Conversores static_cast, dynamic_cast y const_cast en C++

  • 6 min

En C++ los casts específicos son formas más controladas de realizar conversiones entre tipos. Estos son static_cast, dynamic_cast, const_cast y reinterpret_cast.

Cada uno tiene su propósito específico

  • static_cast: Para conversiones entre tipos relacionados sin polimorfismo
  • dynamic_cast: Para conversiones seguras en jerarquías de clases polimórficas
  • const_cast: Para eliminar o añadir const (con precaución ⚠️)
  • reinterpret_cast: Conversiones de bajo nivel entre tipos no relacionados, como punteros y enteros (con mucha precaución ❗)

Estos permiten gestionar de manera más segura la conversión de tipos, frente al operador “clásico” de conversión (tipoDato)objeto (sobre todo al trabajar con jerarquías de clases y herencia).

Aunque el operador (tipoDato) es más rápido de escribir, puede ser peligroso porque no realiza ningún tipo de verificación de seguridad, lo que puede resultar en error.

Conversión con static_cast

static_cast se usa para conversiones entre tipos relacionados que pueden ser determinadas en tiempo de compilación. Este tipo de cast es muy útil para convertir entre tipos numéricos, así como en jerarquías de clases sin polimorfismo.

No se debe usar static_cast cuando hay polimorfismo involucrado, ya que no comprueba si la conversión es segura en tiempo de ejecución. En su lugar, debes utilizar dynamic_cast en estos casos.

Conversión con dynamic_cast

dynamic_cast se utiliza principalmente cuando trabajamos con jerarquías de clases que tienen al menos una función virtual (es decir, clases con polimorfismo).

Este tipo de cast es el único que verifica la validez de la conversión en tiempo de ejecución, devolviendo nullptr si la conversión no es posible.

  • No uses dynamic_cast si puedes determinar la conversión en tiempo de compilación (usa static_cast en esos casos).

Conversión con const_cast

const_cast se utiliza para eliminar o añadir el calificador const a un objeto.

Aunque parece útil, modificar un objeto que fue declarado originalmente como const puede resultar en comportamiento indefinido, así que se debe usar con precaución.

  • Evita modificar objetos que fueron originalmente declarados como const
  • Es más, en general evita usarlo 😉

Conversión con reinterpret_cast

reinterpret_cast es el cast más peligroso y se utiliza para realizar conversiones de bajo nivel entre tipos de punteros o entre punteros y tipos de datos enteros.

A diferencia de los otros tipos de cast, no realiza ningún tipo de verificación de seguridad y simplemente “reinterpretará” los bits del objeto en el nuevo tipo.

Básicamente, reinterpret_cast es similar al cast clásico (tipoDato).

  • Evita usarlo para cualquier tipo de conversión entre clases o tipos de datos que no estén directamente relacionados
  • Es más, evita mucho usarlo