У static_cast
здійснює явне приведення типу. Перетворення, що виконуються за допомогою static_cast
, не є типобезпечними, оскільки перевірка типів відбувається тільки на етапі компіляції; під час виконання можуть приводитися значення несумісних типів.
Синтаксис
static_cast < type > ( object )
static_cast
створено для виконання всіх видів перетворень, які дозволені компілятором. Оператор 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 ); // не компілюється, компілятор не може знайти підхожий конструктор
Див. також
Примітки
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U movi C operator span class k static cast span zdijsnyuye yavne privedennya tipu Peretvorennya sho vikonuyutsya za dopomogoyu span class k static cast span ne ye tipobezpechnimi oskilki perevirka tipiv vidbuvayetsya tilki na etapi kompilyaciyi pid chas vikonannya mozhut privoditisya znachennya nesumisnih tipiv Sintaksisstatic cast lt type gt object span class k static cast span stvoreno dlya vikonannya vsih vidiv peretvoren yaki dozvoleni kompilyatorom Operator span class k static cast span analogichnij do operatora krugli duzhki za vinyatkom togo sho vin ne vikonuye privedennya vkazivnikiv na bazovi tipi do vkazivnikiv na dovilni tipi dlya cogo vikoristovuyetsya operator span class k reinterpret cast span span class k static cast span takozh ne mozhe vidkidati modifikatori const volatile ta unaligned dlya cogo vikoristovuyetsya operator span class k const cast span Obmezhen na tip object nemaye Obmezhennya na type isnuye povinen isnuvati sposib privesti tip yakim ye object do tipu type U zagalnomu vipadku span class k static cast span mozhe generuvati dodatkovij kod napriklad viklik perevantazhenogo operatora privedennya tipu abo konstruktora Pomilki mozhlivi u takih vipadkah privedennya do nepravilnogo tipu vidsutnist sposobu privedennya Zastosuvannyaprivedennya cilih tipiv do dijsnih i navpaki peretvorennya znachen tipiv z riznoyu rozryadnistyu yak zbilshennya tak i zmenshennya rozryadnosti zadlya usunennya poperedzhennya kompilyatora pro mozhlivu vtratu tochnosti napriklad pri peredachi argumentu tipu span class kt double span u funkciyu yaka prijmaye span class kt float span privedennya vkazivnikiv do tipu span class kt void span span class o span i navpaki privedennya vkazivnikiv na dovilni tipi do vkazivnikiv na bazovi tipi ale ne navpaki yavnij viklik konstruktora z odnim argumentom abo perevantazhenogo operatora privedennya tipu struct Type konstruktor z odnim argumentom dlya privedennya tipu int do tipu Type Type int perevantazhenij operator dlya privedennya tipu Type do tipu double operator double const int main Type x y int i double d viklik konstruktora z odnim argumentom x y static cast lt Type gt i viklik perevantazhenogo operatora privedennya tipu d static cast lt double gt x return 0 Konstruktor mozhe mati bilshe argumentiv ale dlya nih povinni buti zadani znachennya za zamovchuvannyam struct Type konstruktor z kilkoma argumentami dlya privedennya tipu Type do tipu int dlya drugogo i tretogo argumentiv ukazani znachennya za zamovchuvannyam Type int int 10 float 0 0 privedennya tipiv u shablonah kompilyator uzhe pri specializaciyi shablona virishuye yaki operaciyi vikoristovuvati privedennya operandiv ternarnogo operatora umovi do odnogo tipu znachennya 2 go i 3 go operandiv povinni mati odin i toj zhe tip Prikladi Otrimati vidsotok vluchen double hitpercent const int aHitCount kilkist vluchen const int aShotCount kilkist postriliv if aShotCount 0 return 0 0 Privedennya tipiv do double vidbuvayetsya dlya vikliku operatora dilennya dijsnih chisel zamist operatora dilennya cilih chisel tomu rezultatom bude dijsne a ne cile chislo return static cast lt double gt aHitCount 100 static cast lt double gt aShotCount nastupni ryadki ekvivalentni vikoristannya operatora static cast string s static cast lt string gt Hello viklik konstruktora z odnim argumentom string s string Hello vikoristannya operatora krugli duzhki string s string Hello string s static cast lt string gt 5 ne kompilyuyetsya kompilyator ne mozhe znajti pidhozhij konstruktorDiv takozhPrivedennya tipiv dynamic castPrimitkiProgramming principles and practice using C SShA Addison Wesley 2008 ISBN 0321543726