Use o Comando static_cast em C++
-
Use
static_castpara converter explicitamente tipos de objetos em C++ -
Use
reinterpret_castpara converter explicitamente tipos de objetos 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
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