Операция static_cast в языке C++ осуществляет явное допустимое приведение типа данных.
Синтаксис:
Код скомпилируется, если есть способ преобразования из object_from в type_to.
Пример int nShots = 10, nHits = 8; auto hitRate = static_cast<float>(nHits) / nShots;
Возможные преобразования типов
static_cast создан для выполнения всех видов преобразований, разрешённых компилятором. Все преобразования работают, только если есть совместимость по и .
1. Любое из преобразований типа, которые Си++ производит неявно (например, массива в указатель, одного числового типа в другой, -указателя в типизированный, неявный вызов конструктора). Явное написание может потребоваться, например: в шаблоне; для выбора, какую версию функции или операции использовать: чтобы подавить предупреждение компилятора «Возможна потеря точности»: чтобы согласовать типы в трёхместной условной операции: .
2. Если соответствующее преобразование отмечено ключевым словом .
3. Преобразование из/в тип . enum class TriBool { FAL, TRU, UNDEF, NN }; enum { TriBool_N = static_cast<int>(TriBool::NN) }; const char* triBoolNames[TriBool_N] = { "false", "true", "undef" };
auto x = TriBool::TRU; std::cout << triBoolNames[static_cast<int>(x)] << std::endl;
4. Для явного указания, какую из перегруженных функций брать. std::transform(s.begin(), s.end(), s.begin(), static_cast<int(*)(int)>(std::toupper));
5. Для преобразования указателей вниз по иерархии типов без проверки типа. В отличие от преобразования в стиле Си и , преобразование в неродственный класс невозможно. void TSomeForm::someButtonClick(TObject* sender) { // Событие C++ Builder // Мы знаем, что это TButton, ведь мы сами устанавливали событие // в редакторе форм или конструкторе TButton* bt = static_cast<TButton*>(sender); bt->Caption = L"Clicked!"; }
Возможные логические ошибки Возможные ошибки зависят от того, какое преобразование проводится. Возможны переполнения, выход за диапазон и даже (для преобразования указателей) порча памяти.
Например, при преобразовании переменная может заполучить недопустимое значение и программа не будет готова к этому.
См. также Приведение типа dynamic_cast reinterpret_cast const_cast
Примечания
Категория:Синтаксис C++ Категория:Типы данных