Use o Comando static_cast em C++

Jinku Hu 12 outubro 2023
  1. Use static_cast para converter explicitamente tipos de objetos em C++
  2. Use reinterpret_cast para converter explicitamente tipos de objetos em C++
Use o Comando static_cast em C++

Este artigo demonstrará vários métodos sobre como usar static_cast em C++.

Use static_cast para converter explicitamente tipos de objetos em C++

Uma operação que converte um objeto em um tipo diferente é chamada de casting. Há casos em que ocorrem conversões implícitas em C++ de acordo com as regras de linguagem, por exemplo, decaimento de array para ponteiro. Ainda assim, a conversão está principalmente associada à solicitação de conversão explícita que o usuário faz. Quando convertemos um valor do objeto ou da expressão para um tipo diferente, forçamos o compilador a associar o tipo fornecido ao ponteiro que aponta para o objeto.

Existem quatro operações de cast explícito nomeadas: const_cast, static_cast, reinterpret_cast e dynamic_cast. Essas operações são nativas da linguagem C++ moderna e são relativamente legíveis do que os antigos casts de estilo C. As conversões são frequentemente perigosas e até programadores experientes cometem erros com elas, mas você não deve desanimar de utilizar essas operações de conversão quando necessário. Neste artigo, apresentamos uma visão geral apenas das operações static_cast e reinterpret_cast.

A função static_cast é geralmente usada para converter tipos relacionados como ponteiros da mesma hierarquia de classes ou tipos numéricos entre si. Este comando também lida com conversões definidas por construtores e operadores de conversão. Observe que a segunda linha na função main está essencialmente realizando a conversão implícita do char com sinal em um inteiro com sinal, que é apenas um pouco da versão obscura da próxima linha.

É a forma recomendada de conduzir o casting em C++ contemporâneo, embora o resultado seja o mesmo. Por outro lado, a quarta e quinta linhas da função main não são conversões válidas usando a operação static_cast. Embora, possamos forçar a última conversão usando o elenco de estilo C, (int*)x, que imprime o valor inteiro 97 com forma hexadecimal e notação de endereço de memória. Observe que essa operação provavelmente gerará um aviso do 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;
}

Resultado:

a 97 97 0x61 0x7ffeb7c31997

Use reinterpret_cast para converter explicitamente tipos de objetos em C++

Alternativamente, o último elenco de estilo C pode ser feito usando a operação reinterpret_cast mostrada no exemplo de código a seguir. Este método silencia o aviso do compilador e o usuário pode assumir a responsabilidade pela conversão. Podemos converter diferentes tipos de ponteiro usando reinterpret_cast como char* para int*.

Neste caso, o endereço impresso é o mesmo onde o caractere x está armazenado. Lembre-se de que se removermos a referência do ponteiro x_iii para acessar o valor, não obteremos o caractere a ou sua alternativa ASCII, mas sim um inteiro estranho. Este inteiro é recuperado do mesmo local. Apenas o tamanho do tipo de dados é diferente, pois é interpretado 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;
}

Resultado:

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

Artigo relacionado - C++ Cast