Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

Для чего нужен static_cast, как он работает и где его применяют?

Для чего нужен static_cast, как он работает и где его применяют?


Ответ

У static_cast очень много различных применений. Его идея состоит в следующем: это ограниченный по мощи C-style cast. Ограничение нужно потому, что C-style cast может привести что угодно к чему угодно (ну, почти), и тем самым может скрыть ошибку. Например, вы можете случайно закастить const char* в char*, получив крэш в некоторых системах с аппаратной поддержкой const-памяти. static_cast вам такого не позволит. Большую часть времени, когда вы хотите сделать явное преобразование типов (а я надеюсь, это бывает достаточно редко), вы хотите именно static_cast Формальный список всего, что умеет static_cast, очень большой, я приведу лишь наиболее важные вещи, которые он умеет (а также которые он не умеет): Что можно: Преобразование указателя на родительский класс к указателю на дочерний класс. Объект по указателю обязан быть правильного дочернего класса, иначе undefined behaviour. Если вы не уверены и хотите проверить, тот ли подкласс у объекта, пользуйтесь dynamic_cast (он специально для этого предназначен). Преобразования между числовыми типами. int, long, char, unsigned int — все их можно кастить друг в друга при помощи static_cast Можно закастить любое выражение в void. Результат будет вычислен и отброшен (но побочные эффекты, разумеется, выполнятся). static_cast может привести константу nullptr к любому типу-указателю. Обычно это не нужно и можно полагаться на неявное преобразование типов, но иногда (например, для выбора нужной перегрузки функции) такое может пригодится. Что нельзя: Преобразование между указателями на в принципе несовместимые типы. Например, указатель на double нельзя привести к указателю на int. Для трюков с нарушением type safety пользуйтесь reinterpret_cast Указатели на типы, а также сами типы с несовместимыми атрибутами const и/или volatile. Если вам необходимо нарушить const-корректность, пользуйтесь const_cast Разумеется, вы не сможете привести указатель на функцию-член к указателю на обычную функцию, или указатель на код к указателю на данные. Для подобных грязных хаков пользуйтесь reinterpret_cast Ещё одной причиной использования static_cast (как и других C++-специфических преобразований типов) является лёгкость его поиска в исходниках, как глазами, так и поисковыми утилитами. Сишный каст (особенно его функциональную разновидность) очень легко пропустить в коде. Для сравнения, «привычное» преобразование типов (C-style cast) равносильно следующей последовательности: const_cast Если const_cast не может дать нужный результат, то static_cast (но с разрешённым преобразованием к недообъявленному типу) Если и так не выходит, то компилятор пробует в хвост к static_cast добавить const_cast Если и это не получается, то reinterpret_cast ... а если не выйдет, то к нему дописывается const_cast

Комментариев нет:

Отправить комментарий