Static_cast


Operace static_cast v C++ provádí explicitní , platné přetypování [1] .

Syntax:static_cast < type_to > ( object_from )

Kód se zkompiluje, pokud existuje způsob, jak převést z object_fromna type_to.

Příklad

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

Možné převody typů

static_castnavržený k provádění všech druhů konverzí, které kompilátor umožňuje [2] . Všechny převody fungují pouze v případě kompatibility s a . constvolatile

1. Jakákoli typová konverze, kterou C++ provádí implicitně (například pole na ukazatel, jeden číselný typ na jiný, -ukazatel na typovaný, implicitní vyvolání konstruktoru). Může být vyžadováno explicitní psaní , například: void*static_cast

  • v šabloně;
  • vybrat, kterou verzi funkce nebo operace použít:auto hitRate = static_cast<float>(nHits) / nShots;
  • potlačení varování kompilátoru "Možná ztráta přesnosti":double a = 1.0; auto b = static_cast<float>(a);
  • pro shodu typů v ternární podmíněné operaci: .Base& x = use1 ? static_cast<Base&>(obj1) : static_cast<Base&>(obj2);

2. Pokud je odpovídající transformace označena klíčovým slovem . explicit

3. Převod z/do typu . enum class

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. Výslovně označit, kterou z přetížených funkcí převzít.

std :: transform ( s . begin (), s . end (), s . begin (), static_cast < int ( * )( int ) > ( std :: toupper ));

5. Chcete-li převést ukazatele dolů v hierarchii typů bez kontroly typu. Na rozdíl od převodu ve stylu C a , převod na nesouvisející třídu není možný. reinterpret_cast

void TSomeForm::someButtonClick ( TObject * odesílatel ) { // Událost C++ Builder // Víme, že je to TButton, protože událost jsme nastavili sami // v editoru formulářů nebo konstruktoru TButton * bt = static_cast < TButton *> ( odesílatel ); bt -> Titulek = L "Clicked!" ; }

Možné logické omyly

Možné chyby závisí na tom, jaký druh převodu se provádí. Jsou možné přetečení, mimo rozsah a dokonce (pro převod ukazatelů) poškození paměti.

Například při převodu může proměnná získat neplatnou hodnotu a program na to nebude připraven. int enum class

Viz také

Poznámky

  1. ↑ Programování : principy a praxe v C++  . - Spojené státy americké : Addison-Wesley , 2008. - S. 594. - ISBN 0321543726 .
  2. ↑ Myšlení v C++  . - Spojené státy americké : Alan Apt, 2000. - S. 857. - ISBN 0-13-979809-9 .