As vezes, durante a construção de um programa em particular, precisamos converter o valor contido em uma variável para uma variável de outro tipo. Pode ser de nosso interesse, por exemplo, fazer a divisão de uma variável do tipo inteiro soma por 777. Ao fazermos isso da forma convencional (soma/777) o compilador tratará tal instrução como uma divisão de inteiros, ou seja, o nosso resultado será um inteiro e qualquer casa decimal após a parte inteira será perdida (truncada). Por exemplo:

	int soma = 516;
	cout << "Temos como resultado: " << soma/777 << endl;

Embora esperássemos o resultado 0,66, apenas a parte inteira será enviada para saída ou seja, teremos 0 como resposta. Para tratar tais situações, o C++ nos permite aplicar conversões. Podemos, por exemplo, utilizar o principio de que: uma variável do tipo double possui mais precisão do que uma variável do tipo int, logo podemos atribuir um int a um double sem perda de informação. Logo:

	int soma = 516;
	double temp = soma;
	cout << "Temos como resultado: " << temp/777 << endl;

nos dará o resultado esperado.

O C++ também dispõe da instrução static_cast e do operador de molde para aplicarmos tais conversões. Na primeira forma, usamos a sintaxe static_cast seguida do tipo ao qual queremos converter entre '<' e '>', em seguida o valor a ser convertido. O operador de molde consiste em escrever o nome do tipo desejado e, em seguida o valor a ser convertido entre parênteses. Portanto, obtemos os mesmos resultados com as instruções:

	int soma = 526;
	cout << "Temos como resultado: " << static_cast<double>(soma)/777 << endl;

ou

	int soma = 526;
	cout << "Temos como resultado: " << double(soma)/777 << endl;

Obs: Quando o nome do tipo desejado contém um espaço em branco, devemos usa parênteses no tipo seguido do valor, como por exemplo:

	int x = 65;
	cout << (unsigned char)x; // imprime A
Note que, os modos apresentados acima também podem ser utilizados para converter uma variável de maior precisão em uma de menor precisão. Como é de se esperar, ao fazermos isso termos perda de dados como no primeiro caso apresentado.

Quando trabalhamos com char em C++ precisamos levar em conta o fato de que: cada caractere é codificado no C++ em ASCII. Sendo assim podemos fazer a conversão de um tipo char para um int ou vice-versa. Por exemplo:

	char exclamation = '!';
	int temp = exclamation;

ao verificarmos o valor da variável temp encontramos 33 que é justamente a codificação em ASCII para a '!'.

Agora que já sabemos o básico sobre conversões entre tipos no C++, o leitor deve ter notado que isso não resolve todos os nossos problemas. As conversões que mostramos ate aqui dizem respeito aos chamados tipos básicos como int, double e char. Suponha que nos queremos converter o inteiro 86 para sua representação textual. Uma variável do tipo char não nos seria util já que, se colocassemos esse valor em uma variavel char obteríamos como resultado o caractere ASCII de código 86, a saber 'V'. Uma string nos seria mais adequado, pois assim poderíamos converter o valor 86 para "86" ou ainda, levando em conta que uma string é um array de caracteres, teríamos um array com '8' e '6' (lembrando quem uma string em C++ termina com o caractere de fim de string '\0').

Para aplicarmos a idéia sugerida anteriormente faremos uso da classe stringstream da biblioteca sstream.

Primeiramente precisamos incluir a biblioteca a ser utilizada.

	#include <iostream>
	using std::cout;
	using std::endl;

	#include <sstream>
	using std::stringstream;

	#include <string>
	using std::string;

Agora podemos criar nossos objetos stringstream. Criaremos um objeto chamado ss, com capacidade tanto de entrada com de saída de valores. Para isso usamos os parâmetros stringstream::in e stringstream::out no construtor do nosso objeto para habilita-lo para entrada e saída, respectivamente.

	stringstream ss (stringstream::in | stringstream::out);

Agora que temos nosso objeto, usaremos o operador de entrada de fluxo para adicionar a string desejada. Temos:

	ss << "120 42 377 6 5 2000";

Temos agora um objeto stringstream que possui nossa string com diversos números. Vamos fazer a conversão desses números, armazena-los numa variável e manda-los para a saída. Para isso, usamos o operador de saída de fluxo. Tal operador sobrecarregado se adequa e manda para a variável alvo um dado do tipo dessa variável. Por exemplo:

	int x;

	while( ss >> x )
		cout << x << " ";
	cout << endl;

Fazendo isso, mandaremos os dados armazenados na string contida no objeto ss para uma variável do tipo int. Você notará também que, à medida que as valores vão sendo jogados em x, o objeto trata de mandar o a partir do ponto onde parou ignorando os espaços.

Agora que sabemos como converter de um string para um variável numérica vamos fazer o sentido contrario. Vamos criar um outro objeto camado sout para podemos acrescentar um valor a ele, pois caso isso seja feito no objeto ss o novo valor será concatenado aos valores já presentes.

	stringstream sout (stringstream::in | stringstream::out);

Agora, podemos atribuir um valor ao objeto sout, em seguida recuperar esse valor em forma de string pelo método str do objeto stringstream desta forma:

	sout << 120;
	cout << “O valor contido na string eh: “ << sout.str()  << endl;

Poderíamos também, usar o operador de saída de fluxo de forma a jogar o conteúdo de sout em uma string desta forma:

	string value;
	sout >> value;
	cout << “O valor contido na variável value eh: “ << value << endl;

Bem, acho que agora sabemos o suficiente sobre conversões de variáveis.

Referencias: http://www.cplusplus.com

Anexo

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main ()
{
	int soma = 516;
	cout << "Temos como resultado: " << soma/777 << endl;

	int soma2 = 516;
	double temp = soma2;
	cout << "Temos como resultado: " << temp/777 << endl;
	
	int soma3 = 526;
	cout << "Temos como resultado: " << static_cast<double>(soma3)/777 << endl;

	cout << "Temos como resultado: " << double(soma3)/777 << endl;
	
	char exclamation = '!';
	int temp2 = exclamation;
	cout << "O código ASCII do caractere '!' eh: " << temp2 << endl;

	stringstream ss (stringstream::in | stringstream::out);

	ss << "120 42 377 6 5 2000";

	int x;

	while( ss >> x )
		cout << x << " ";
	cout << endl;

	stringstream sout (stringstream::in | stringstream::out);

	sout << 120;
	cout << "O valor contido na string eh: " << sout.str() << endl;

	string value;
	sout >> value;
	cout << "O valor contido na variável value eh: " << value << endl;

	return 0;
}