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 para double automaticamente.

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, double para int) 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.