static_cast

У мові C++ оператор static_cast здійснює явне приведення типу[1]. Перетворення, що виконуються за допомогою static_cast, не є типобезпечними, оскільки перевірка типів відбувається тільки на етапі компіляції; під час виконання можуть приводитися значення несумісних типів.

Синтаксис

static_cast < type > ( object )

static_cast створено для виконання всіх видів перетворень, які дозволені компілятором[1]. Оператор static_cast аналогічний до оператора «круглі дужки» за винятком того, що він не виконує приведення вказівників на базові типи до вказівників на довільні типи (для цього використовується оператор reinterpret_cast). static_cast також не може відкидати модифікатори const, volatile та __unaligned — для цього використовується оператор const_cast.

Обмежень на тип object немає. Обмеження на type існує: повинен існувати спосіб привести тип, яким є object, до типу type.

У загальному випадку static_cast може генерувати додатковий код, наприклад, виклик перевантаженого оператора приведення типу або конструктора.

Помилки можливі у таких випадках:

  • приведення до неправильного типу;
  • відсутність способу приведення.

Застосування

  • приведення цілих типів до дійсних і навпаки;
  • перетворення значень типів з різною розрядністю (як збільшення, так і зменшення розрядності);
  • задля усунення попередження компілятора про можливу втрату точності, наприклад, при передачі аргументу типу double у функцію, яка приймає float;
  • приведення вказівників до типу void* і навпаки;
  • приведення вказівників на довільні типи до вказівників на базові типи, але не навпаки;
  • явний виклик конструктора з одним аргументом або перевантаженого оператора приведення типу;
struct Type {
   // конструктор з одним аргументом для приведення типу int до типу Type
   Type ( int );

   // перевантажений оператор для приведення типу Type до типу double
   operator double () const;
};

int main () {
   Type x, y;
   int i;
   double d;

   // виклик конструктора з одним аргументом
   x = y + static_cast< Type >( i );

   // виклик перевантаженого оператора приведення типу
   d = static_cast< double >( x );

   return 0;
}

Конструктор може мати більше аргументів, але для них повинні бути задані значення за замовчуванням:

struct Type {
   // конструктор з кількома аргументами для приведення типу Type до типу int;
   // для другого і третього аргументів указані значення за замовчуванням
   Type ( int, int = 10, float = 0.0 );
};
  • приведення типів у шаблонах (компілятор уже при спеціалізації шаблона вирішує, які операції використовувати);
  • приведення операндів тернарного оператора умови «?:» до одного типу (значення 2-го і 3-го операндів повинні мати один і той же тип);

Приклади

// Отримати відсоток влучень
double hitpercent (
   const int aHitCount, // кількість влучень
   const int aShotCount // кількість пострілів
) {
   if ( aShotCount == 0 ) return 0.0;
   // Приведення типів до double відбувається для виклику оператора ділення дійсних чисел
   // замість оператора ділення цілих чисел, тому результатом буде дійсне, а не ціле, число
   return static_cast< double >( aHitCount * 100 ) / static_cast< double >( aShotCount );
}

// наступні рядки еквівалентні

// використання оператора static_cast
string s = static_cast< string >( "Hello!" );
// виклик конструктора з одним аргументом
string s = string( "Hello!" );
// використання оператора "круглі дужки"
string s = (string) "Hello!";

string s = static_cast< string >( 5 ); // не компілюється, компілятор не може знайти підхожий конструктор

Див. також

Примітки

  1. Programming: principles and practice using C++. США: Addison-Wesley. 2008. ISBN 0321543726.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.