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 ); // не компілюється, компілятор не може знайти підхожий конструктор
Див. також
- Приведення типів
- dynamic cast
- reinterpret cast
- const cast