Conversão entre tipos de dados
Aqui está um tutorial prático sobre conversão entre tipos de dados em C++, abordando conversão implícita, explícita (type casting), conversão envolvendo strings e boas práticas:
1. O que é conversão de tipos?
Conversão de tipos (type conversion) é o processo de transformar um valor de um tipo de dado para outro. Em C++, isso pode ocorrer de forma implícita (automática) ou explícita (forçada pelo programador).
2. Conversão Implícita
A conversão implícita ocorre automaticamente quando se atribui um valor de um tipo a uma variável de outro tipo, desde que a conversão seja segura (sem risco de perda significativa de dados).
Exemplo:
int inteiro = 10;
double real = inteiro; // int é convertido implicitamente para double
- Aqui, o valor de
inteiroé convertido paradoubleautomaticamente.
Conversões implícitas também ocorrem em expressões envolvendo diferentes tipos:
float f = 3.5f;
int i = 2;
float resultado = f + i; // i é convertido para float
Atenção: Conversões implícitas de tipos maiores para menores (por exemplo,
doubleparaint) podem causar perda de dados e gerar avisos do compilador.
3. Conversão Explícita (Type Casting)
Quando é necessário garantir ou forçar a conversão, utiliza o type casting. A sintaxe clássica é:
(tipo) valor
Exemplo:
double x = 7.9;
int y = (int)x; // y recebe 7, parte decimal é descartada
Desde o C++ moderno, também é possível usar os operadores de casting específicos:
static_cast<tipo>(valor)reinterpret_cast<tipo>(valor)const_cast<tipo>(valor)dynamic_cast<tipo>(valor)
Exemplo com static_cast:
float f = 9.8;
int i = static_cast<int>(f); // i recebe 9
4. Conversão entre tipos booleanos, inteiros e strings
bool para int:int x = (int)true; // x = 1
int para bool:bool b = (bool)10; // b = true (qualquer valor diferente de zero é true)
Numérico para string:
Use to_string:
int n = 42;
string s = to_string(n); // "42"
String para numérico:
Use funções como stoi, stof, atof, atoi:
string s = "123";
int n = stoi(s); // n = 123
5. Conversão de ponteiros
Em C++, ponteiros podem ser convertidos, especialmente quando se trabalha com ponteiros genéricos (void*). Para acessar o dado corretamente, é necessário fazer o cast para o tipo correto antes de usar.
Exemplo:
void* ptr = ...;
int* pInt = (int*)ptr;
6. Conversão e perda de dados
Conversões de tipos maiores para menores (por exemplo, de float para int) podem causar perda de dados. O compilador pode emitir avisos ou truncar valores, por isso, use casting explícito com atenção.
7. Exemplo Prático
#include <iostream>
#include <string>
using namespace std;
int main() {
double d = 5.7;
int i = (int)d; // conversão explícita
cout << "int: " << i << endl;
string s = to_string(i); // int para string
cout << "string: " << s << endl;
string s2 = "123";
int n = stoi(s2); // string para int
cout << "int convertido: " << n << endl;
bool b = (bool)n;
cout << boolalpha << "bool: " << b << endl;
return 0;
}
8. Boas práticas
- Prefira conversões explícitas quando houver risco de perda de dados.
- Use funções padrão (
to_string,stoi, etc.) para conversão entre string e tipos numéricos. - Fique atento a avisos do compilador sobre conversões inseguras.
