Utilice el comando static_cast en C++

Jinku Hu 12 octubre 2023
  1. Utilice static_cast para convertir explícitamente tipos de objetos en C++
  2. Utilice reinterpret_cast para convertir explícitamente tipos de objetos en C++
Utilice el comando static_cast en C++

Este artículo demostrará varios métodos sobre cómo utilizar static_cast en C++.

Utilice static_cast para convertir explícitamente tipos de objetos en C++

Una operación que convierte un objeto a un tipo diferente se llama casting. Hay casos en los que se producen conversiones implícitas en C++ de acuerdo con las reglas del lenguaje, por ejemplo, decaimiento de array a puntero. Aún así, la transmisión se asocia principalmente con la solicitud de conversión explícita que realiza el usuario. Cuando lanzamos un valor del objeto o la expresión a un tipo diferente, forzamos al compilador a asociar el tipo dado al puntero que apunta al objeto.

Hay cuatro operaciones de conversión explícitas con nombre: const_cast, static_cast, reinterpret_cast y dynamic_cast. Estas operaciones son nativas del lenguaje C++ moderno y son relativamente legibles que las versiones antiguas de estilo C. Los casts son a menudo peligrosos e incluso los programadores experimentados cometen errores con ellos, pero no debe desanimarse de utilizar estas operaciones de conversión cuando sea necesario. En este artículo, solo presentamos una descripción general de las operaciones static_cast y reinterpret_cast.

La función static_cast se utiliza generalmente para convertir tipos relacionados como punteros de la misma jerarquía de clases o tipos numéricos entre sí. Este comando también maneja conversiones definidas por constructores y operadores de conversión. Tenga en cuenta que la segunda línea de la función main esencialmente realiza la conversión implícita del char con signo a un entero con signo, que es solo un poco de la versión oscurecida de la siguiente línea.

Es la forma recomendada de realizar la conversión en C++ contemporáneo, aunque el resultado sea el mismo. Por otro lado, las líneas cuarta y quinta de la función main no son conversiones válidas utilizando la operación static_cast. Sin embargo, podemos forzar la última conversión usando la conversión de estilo C, (int*)x, que imprime el valor entero 97 con forma hexadecimal y notación de dirección de memoria. Tenga en cuenta que esta operación probablemente generará una advertencia del compilador.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char x = 'a';
  int x_i = x;
  int x_ii = static_cast<int>(x);
  int* x_iii = static_cast<int*>(x);   // ERROR
  int* x_iii = static_cast<int*>(&x);  // ERROR
  int* x_iii = (int*)x;                // WARNING

  cout << x << endl;
  cout << x_i << endl;
  cout << x_ii << endl;
  cout << x_iii << endl;

  return EXIT_SUCCESS;
}

Producción :

a
97
97
0x61
0x7ffeb7c31997

Utilice reinterpret_cast para convertir explícitamente tipos de objetos en C++

Alternativamente, la última conversión de estilo C se puede hacer usando la operación reinterpret_cast que se muestra en el siguiente ejemplo de código. Este método silenciará la advertencia del compilador y el usuario puede asumir la responsabilidad de la conversión. Podemos convertir diferentes tipos de punteros usando reinterpret_cast como char* a int*.

En este caso, la dirección impresa es la misma que en la que está almacenado el carácter x. Recuerde que si desreferenciamos el puntero x_iii para acceder al valor, no obtendremos el carácter a o su alternativa ASCII, sino un entero extraño. Este número entero se recupera de la misma ubicación. Solo el tamaño del tipo de datos es diferente ya que se interpreta como int.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char x = 'a';
  int* x_i = (int*)x;  // WARNING
  int* x_ii = reinterpret_cast<int*>(x);
  int* x_iii = reinterpret_cast<int*>(&x);

  cout << x_i << endl;
  cout << x_ii << endl;
  cout << x_iii << endl;

  return EXIT_SUCCESS;
}

Producción :

0x61
0x61
0x7ffca18be95f
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Cast