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