В связи с тем, что С++ является строго типизированным языком, лучшая практика в преобразовании типов - избегать преобразований. Часто, если появляется необходимость в преобразовании типов (не задуманная программистом), значит, в программе есть какие-то проблемы.
Так как язык С++ является наследником языка С, то в программах С++ можно использовать преобразование типов в стиле С. Однако, данное преобразование типов является небезопасным, так как позволяет использовать заведомо неправильные конструкции, например:
badboy.cpp
structarray{double* value;size_t size;}* p =new array;float* a =(float*)p;
Компилятор языка С++ в данном случае не выдаст ошибку, не смотря на то, что представлено заведомо неправильное преобразование указателей.
Для написания безопасного кода в язык С++ были введены 4 оператора преобразования типов, такие как:
static_cast - используется для преобразования статических переменных базового типа или сравнимых указателей (например, указатель на объект родительского класса в указатель на объект дочернего класса). Пример использования:
int a =10, b =3;float result =static_cast<float>(a)/ b;
const_cast - используется при преобразовании неконстантных выражений в константые и наоборот. Не рекомендуется к использованию! Данный оператор позволяет , в частности, изменять выражения, определённые как константные.
dynamic_cast - используется для преобразования указателей. Чаще всего можно обойтись без данного преобразования. Пример использования:
structA{int value;};structB: A {voidPrint(){};};A* a =newB();dynamic_cast<B*>(a)->Print();
reinterpret_cast - по поведению совпадает с преобразованием типов в стиле С. Не рекомендуется к использованию!