Русская Википедия:Static cast

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску


Операция static_cast в языке C++ осуществляет явное допустимое приведение типа данных[1].

Синтаксис: Шаблон:Cpp

Код скомпилируется, если есть способ преобразования из object_from в type_to.

Пример

int nShots = 10, nHits = 8;
auto hitRate = static_cast<float>(nHits) / nShots;

Возможные преобразования типов

static_cast создан для выполнения всех видов преобразований, разрешённых компилятором[2]. Все преобразования работают, только если есть совместимость по Шаблон:Cpp и Шаблон:Cpp.

1. Любое из преобразований типа, которые Си++ производит неявно (например, массива в указатель, одного числового типа в другой, Шаблон:Cpp-указателя в типизированный, неявный вызов конструктора). Явное написание Шаблон:Cpp может потребоваться, например:

  • в шаблоне;
  • для выбора, какую версию функции или операции использовать: Шаблон:Cpp
  • чтобы подавить предупреждение компилятора «Возможна потеря точности»: Шаблон:Cpp
  • чтобы согласовать типы в трёхместной условной операции: Шаблон:Cpp.

2. Если соответствующее преобразование отмечено ключевым словом Шаблон:Cpp.

3. Преобразование из/в тип Шаблон:Cpp.

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. Для преобразования указателей вниз по иерархии типов без проверки типа. В отличие от преобразования в стиле Си и Шаблон:Cpp, преобразование в неродственный класс невозможно.

void TSomeForm::someButtonClick(TObject* sender)
{
  // Событие C++ Builder
  // Мы знаем, что это TButton, ведь мы сами устанавливали событие
  // в редакторе форм или конструкторе
  TButton* bt = static_cast<TButton*>(sender);
  bt->Caption = L"Clicked!";
}

Возможные логические ошибки

Возможные ошибки зависят от того, какое преобразование проводится. Возможны переполнения, выход за диапазон и даже (для преобразования указателей) порча памяти.

Например, при преобразовании Шаблон:Cpp переменная может заполучить недопустимое значение и программа не будет готова к этому.

См. также

Примечания

Шаблон:Примечания