Viajando pelo Google Maps, descobri que a Grecia tem uma ilha chamada Karpathos, na regiao do Dodecaneso, que e a cara de Florianopolis, a ilha brasileira no litoral de Santa Catarina. Temos mais em comum com a Grecia do que imaginavamos, hehe... A esquerda, Florianopolis, Santa Catarina, BrasilA direita, Karpathos, Dhodhekanisos, Grecia Este artigo e dedicado aos programadores iniciantes na linguagem C++, e trata sobre as diversas maneiras de converter objetos de um tipo para outro usando a sintaxe da linguagem.Todo programador sabe que muitas vezes e preciso converter uma variavel, estrutura ou objeto de um determinado tipo para outro, por qualquer motivo que seja. A antiga linguagem C, antepassada do C++, permite isso de uma maneira muito simples, bastando usar a seguinte sintaxe:TipoA variavelDeTipoA = (TipoA) variavelDeTipoBAte ai tudo bem, isso e um conceito basico da linguagem C. Acontece que em C++, sendo "herdeira" direta de C, herdou essa sintaxe de conversao de tipo. No entanto, C++ introduziu os seus proprios operadores de cast, com uma sintaxe especifica que permite um melhor entendimento e uma maior visibilidade das conversoes, alem de torna-las mais seguras. Nao estou me referindo a sintaxe alternativa dos casts de C, que podem ser escritos da seguinte forma (reescrevendo o exemplo anterior):TipoA variavelDeTipoA = TipoA(variavelDeTipoB)A confusao comeca porque em C++ existem formas diferentes de cast, e cada uma tem um objetivo diferente. Se voce nao conhece e nunca os viu, saiba que a sintaxe e horrivel, e supostamente isso e proposital. Confira abaixo as diferentes sintaxes de cast:TipoA variavelDeTipoA = static_cast<TipoA>(variavelDeTipoB)TipoA variavelDeTipoA = dynamic_cast<TipoA>(variavelDeTipoB)TipoA variavelDeTipoA = const_cast<TipoA>(variavelDeTipoB)TipoA variavelDeTipoA = reinterpret_cast<TipoA>(variavelDeTipoB)Como voce pode ver, os quatro operadores sao static_cast, dynamic_cast, const_cast e reinterpret_cast. Essas palavras sao acompanhadas do nome do tipo ao qual se deseja converter, entre os sinais de menor e maior, parecido com a sintaxe dos templates (pra quem ja sabe o que sao templates).Cada um destes casts tem um significado diferente. Segue abaixo as situacoes em que voce deve usar um ou outro:static_castSe utiliza para conversoes genericas entre tipos, porem pode ser perigoso pois este operador nao faz nenhuma verificacao para garantir que a conversao seja segura, e e o programador que deve se assegurar disso. Por exemplo, com esse operador e possivel converter ponteiros de classes diferentes numa mesma hierarquia, tanto de subclasse para superclasse (upcast) como de superclasse para subclasse (downcast), e esse segundo caso pode gerar bugs, ja que depois de converter um ponteiro de superclasse para o tipo de uma subclasse voce podera estar acessando atraves dele um objeto incompleto (pois a superclasse normalmente tem menos membros do que a subclasse).dynamic_castSe utiliza para conversoes entre ponteiros de objetos de uma mesma hierarquia de classes. Esse operador e mais seguro do que o static_cast, ja que com ele o ponteiro so sera convertido se essa conversao for segura. Em caso da conversao falhar, ele retorna NULL. E possivel fazer tanto upcasts quanto downcasts, porem diferente de static_cast, voce so consegue fazer downcast se o objeto a ser convertido for um objeto valido e completo do tipo ao qual se estiver convertendo.const_castEsse e