Преобразование типов
В связи с тем, что С++ является строго типизированным языком, лучшая практика в преобразовании типов - избегать преобразований. Часто, если появляется необходимость в преобразовании типов (не задуманная программистом), значит, в программе есть какие-то проблемы.
Так как язык С++ является наследником языка С, то в программах С++ можно использовать преобразование типов в стиле С. Однако, данное преобразование типов является небезопасным, так как позволяет использовать заведомо неправильные конструкции, например:
struct array{
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 - используется для преобразования указателей. Чаще всего можно обойтись без данного преобразования. Пример использования:
struct A {int value; }; struct B: A { void Print(){}; }; A* a = new B(); dynamic_cast<B*>(a)->Print();
reinterpret_cast - по поведению совпадает с преобразованием типов в стиле С. Не рекомендуется к использованию!
Last updated