Operadores de Conversão de Tipo em C++: static_cast, const_cast, dynamic_cast e reinterpret_cast

Tabela Comparativa dos Operadores de Cast em C++

Operador Aplicação
static_cast Conversão entre tipos primitivos (como double para int); conversão de ponteiro de classe derivada para classe base; conversão entre ponteiro tipado e void*. Não permite conversão direta entre ponteiros de tipos diferentes.
dynamic_cast Conversão de ponteiro ou referência da classe base para a classe derivada. Requer que a classe base possua pelo menos um método virtual.
const_cast Adicionar ou remover o qualificador const de ponteiros e referências.
reinterpret_cast Conversão arbitrária entre tipos, semelhante ao cast do C. Deve ser evitado sempre que possível.

Uso do static_cast

O static_cast é indicado para conversões seguras entre tipos numéricos, para obter um ponteiro void* a partir de um ponteiro tipado (e vice-versa), e para converter um ponteiro de classe derivada para a classe base. Conversões diretas entre ponteiros de tipos diferentes não são permitidas por este operador.

#include <iostream>

using namespace std;

class Animal {
public:
    virtual void emitirSom() { cout << "Som genérico\n"; }
};

class Cachorro : public Animal {
public:
    void emitirSom() override { cout << "Au au!\n"; }
};

int main()
{
    double valor = 3.99;
    int inteiro = static_cast<int>(valor);
    cout << "Original: " << valor << ", Convertido: " << inteiro << endl;

    void *ptrVoid;
    int *ptrInt = static_cast<int *>(ptrVoid);
    ptrVoid = static_cast<void *>(&valor);

    Cachorro dog;
    dog.emitirSom();
    Animal *animalPtr = static_cast<Animal *>(&dog);
    animalPtr->emitirSom();

    return 0;
}

Uso do dynamic_cast

O dynamic_cast permite converter ponterios ou referências da classe base para a classe derivada em tempo de execução. Para que isso funcione, a classe base precisa ter pelo menos um método virtual, pois o compilador utiliza informações RTTI (Run-Time Type Information) durante a verificação.

#include <iostream>

using namespace std;

class Forma {
public:
    virtual void desenhar() { cout << "Desenhando forma\n"; }
};

class Circulo : public Forma {
public:
    void desenhar() override { cout << "Desenhando círculo\n"; }
};

int main()
{
    Circulo c;
    c.desenhar();

    Forma *formaPtr = dynamic_cast<Forma *>(&c);
    formaPtr->desenhar();

    Circulo *circuloPtr = dynamic_cast<Circulo *>(formaPtr);
    circuloPtr->desenhar();

    return 0;
}

Uso do const_cast

O const_cast é o único operador capaz de modificar o qualificador const de ponteiros e referências. Geralmente é utilizado para remover a constância de uma variável, porém essa prática pode ser perigosa e deve ser empregada com cautela.

int main()
{
    int valor = 42;
    const int *ptrConst = &valor;

    int *ptrMutavel = const_cast<int *>(ptrConst);

    const int *ptrNovamenteConst = const_cast<const int *>(ptrMutavel);

    return 0;
}

Uso do reinterpret_cast

O reinterpret_cast funciona de forma similar ao cast explícito da linguagem C, permitindo conversões praticamente ilimitadas entre tipos. Deve ser utilizado apenas como último recurso, quando nenhum dos demais operadores resolvre o problema.

int main()
{
    int valor = 100;
    int *ptrInteiro = &valor;

    float *ptrFloat = reinterpret_cast<float *>(ptrInteiro);

    return 0;
}

Tags: C++ static_cast dynamic_cast const_cast reinterpret_cast

Publicado em 6-7 19:04 por Thomas