Respostas:
As conversões no estilo C ++ são verificadas pelo compilador. As conversões no estilo C não são e podem falhar no tempo de execução.
Além disso, as conversões no estilo c ++ podem ser pesquisadas com facilidade, enquanto é realmente difícil pesquisar as conversões no estilo c.
Outro grande benefício é que os quatro modelos diferentes de estilo C ++ expressam a intenção do programador de maneira mais clara.
Ao escrever C ++, eu sempre usaria os C ++ sobre o estilo C.
dynamic_cast
s.
(int)something
não pode falhar - você é convertido para int ou erro do compilador.
Em resumo :
static_cast<>()
dá a você a capacidade de verificar o tempo de compilação, o elenco do estilo C não.static_cast<>()
é mais legível e pode ser detectado facilmente em qualquer lugar dentro de um código fonte C ++, C_Style cast is'nt.Mais explicações :
A conversão estática realiza conversões entre tipos compatíveis . É semelhante ao elenco do estilo C, mas é mais restritivo. Por exemplo, a conversão no estilo C permitiria que um ponteiro inteiro aponte para um caractere.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
Como isso resulta em um ponteiro de 4 bytes (um ponteiro para um tipo de dados de 4 bytes) apontando para 1 byte de memória alocada, a gravação nesse ponteiro causará um erro em tempo de execução ou substituirá alguma memória adjacente.
*p = 5; // run-time error: stack corruption
Em contraste com a conversão no estilo C, a conversão estática permitirá que o compilador verifique se os tipos de dados de ponteiro e ponta são compatíveis, o que permite ao programador capturar essa atribuição incorreta de ponteiro durante a compilação.
int *q = static_cast<int*>(&c); // compile-time error
Você também pode verificar esta página para obter mais explicações sobre os lançamentos em C ++: Clique aqui
Consulte Uma comparação dos operadores de conversão de C ++ .
No entanto, o uso da mesma sintaxe para uma variedade de operações de conversão diferentes pode tornar clara a intenção do programador.
Além disso, pode ser difícil encontrar um tipo específico de conversão em uma grande base de código.
a generalidade do elenco do estilo C pode ser um exagero para situações em que tudo o que é necessário é uma simples conversão. A capacidade de selecionar entre vários operadores de fundição diferentes, com diferentes graus de potência, pode impedir que os programadores convertam inadvertidamente para um tipo incorreto.
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
Um ótimo post explicando diferentes lançamentos em C / C ++ e o que o elenco em estilo C realmente faz: https://anteru.net/blog/2007/12/18/200/index.html
Conversão de estilo C, usando a sintaxe da variável (tipo). O pior já inventado. Isso tenta fazer as seguintes transmissões, nesta ordem: (consulte também C ++ Standard, 5.4 expr.cast no 5)
- const_cast
- static_cast
- static_cast seguido por const_cast
- reinterpret_cast
- reinterpret_castseguido por const_cast
static_cast
verifica no momento da compilação se a conversão não está entre tipos obviamente incompatíveis. Ao contrário dynamic_cast
, nenhuma verificação de compatibilidade de tipos é feita em tempo de execução. Além disso, a static_cast
conversão não é necessariamente segura.
static_cast
é usado para converter de ponteiro para classe base em ponteiro para classe derivada ou entre tipos nativos, como enum para int ou flutuar para int.
O usuário de static_cast
deve garantir que a conversão seja segura.
A conversão no estilo C não executa nenhuma verificação, durante a compilação ou no tempo de execução.
Como existem muitos tipos diferentes de transmissão, cada um com semântica diferente, o static_cast <> permite que você diga "Estou fazendo uma conversão legal de um tipo para outro", como de int para dobrar. Um elenco simples no estilo C pode significar muitas coisas. Você está escalando para cima / baixo? Você está reinterpretando um ponteiro?