У мові C++ оператор здійснює явне приведення типу. Перетворення, що виконуються за допомогою , не є типобезпечними, оскільки перевірка типів відбувається тільки на етапі компіляції; під час виконання можуть приводитися значення несумісних типів.
Синтаксис static_cast < type > ( object ) створено для виконання всіх видів перетворень, які дозволені компілятором. Оператор аналогічний до оператора «круглі дужки» за винятком того, що він не виконує приведення вказівників на базові типи до вказівників на довільні типи (для цього використовується оператор ). також не може відкидати модифікатори const, volatile та __unaligned — для цього використовується оператор . Обмежень на тип object немає. Обмеження на type існує: повинен існувати спосіб привести тип, яким є object, до типу type.
У загальному випадку може генерувати додатковий код, наприклад, виклик перевантаженого оператора приведення типу або конструктора.
Помилки можливі у таких випадках: приведення до неправильного типу; відсутність способу приведення.
Застосування
приведення цілих типів до дійсних і навпаки; перетворення значень типів з різною розрядністю (як збільшення, так і зменшення розрядності); задля усунення попередження компілятора про можливу втрату точності, наприклад, при передачі аргументу типу у функцію, яка приймає ; приведення вказівників до типу і навпаки; приведення вказівників на довільні типи до вказівників на базові типи, але не навпаки; явний виклик конструктора з одним аргументом або перевантаженого оператора приведення типу; 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 ); // не компілюється, компілятор не може знайти підхожий конструктор
Див. також Приведення типів dynamic cast reinterpret cast const cast
Примітки