Для чего нужен static_cast, как он работает и где его применяют?
У static_cast
очень много различных применений. Его идея состоит в следующем: это ограниченный по мощи C-style cast. Ограничение нужно потому, что C-style cast может привести что угодно к чему угодно (ну, почти), и тем самым может скрыть ошибку. Например, вы можете случайно закастить const char*
в char*
, получив крэш в некоторых системах с аппаратной поддержкой const-памяти. static_cast
вам такого не позволит.
Большую часть времени, когда вы хотите сделать явное преобразование типов (а я надеюсь, это бывает достаточно редко), вы хотите именно static_cast
.
Формальный список всего, что умеет static_cast
, очень большой, я приведу лишь наиболее важные вещи, которые он умеет (а также которые он не умеет):
Что можно:
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
.Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть три чекбокса, QFontComboBox и QSpinBox, а также главное текстовое поле QTextEdit
На Windows в Visual Studio было достаточно раскидать файлы по специальным папкам и прописать:
Уважаемые сэнсэи, гуру и мастера Йоды Java, нужна подмогаСитуация тривиальная, но тревожащая мой покой
У меня есть небольшая программа, в которой есть ComboBox элементДанный элемент принимет 5 значений для примера