Egy művelet static_cast a C++ nyelvben explicit , érvényes leadást hajt végre [1] .
Szintaxis:static_cast < type_to > ( object_from )
A kód lefordításra kerül, ha van mód a kódról a -ra object_fromkonvertálni type_to.
static_casta fordító által engedélyezett mindenféle átalakítás elvégzésére tervezték [2] . Minden átalakítás csak akkor működik, ha van kompatibilitás a és . constvolatile
1. A C++ által implicit módon végrehajtott típuskonverziók bármelyike (például tömbből mutatóba, egyik numerikus típusból a másikba, -pointerből típusba, implicit konstruktor meghívás). Szükség lehet kifejezett írásra , például:void*static_cast
2. Ha a megfelelő transzformációt a kulcsszóval jelöljük . explicit
3. Konvertálás típusból/típusba . 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. A túlterhelt funkciók egyértelmű jelzése.
std :: transzformáció ( s . kezdődik (), s . end (), s . begin (), static_cast < int ( * )( int ) > ( std :: toupper ));5. Mutatók konvertálása lefelé a típushierarchiában típusellenőrzés nélkül. Ellentétben a C-stílusú konverzióval és a , a konverzió nem kapcsolható osztályba nem lehetséges. reinterpret_cast
void TSomeForm::someButtonClick ( TObject * feladó ) { // C++ Builder esemény // Tudjuk, hogy ez egy TButton, mert mi magunk állítjuk be az eseményt // az űrlapszerkesztőben vagy a TButton konstruktorban * bt = static_cast < TButton *> ( küldő ); bt -> Felirat = L "Kattintott!" ; }A lehetséges hibák attól függnek, hogy milyen átalakítást hajtanak végre. Túlcsordulás, hatótávolságon kívüli, sőt (mutatókonverziók esetén) memóriakárosodás is lehetséges.
Például az átalakítás során egy változó érvénytelen értéket kaphat, és a program nem lesz kész erre. int → enum class