Static_cast


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.

Példa

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

Lehetséges típusátalakítások

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

  • a sablonban;
  • a használni kívánt funkció vagy művelet verziójának kiválasztásához:auto hitRate = static_cast<float>(nHits) / nShots;
  • a fordító "Lehetséges precizitásvesztés" figyelmeztetésének letiltásához:double a = 1.0; auto b = static_cast<float>(a);
  • típusok egyeztetésére egy hármas feltételes műveletben: .Base& x = use1 ? static_cast<Base&>(obj1) : static_cast<Base&>(obj2);

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!" ; }

Lehetséges logikai hibák

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

Lásd még

Jegyzetek

  1. ↑ Programozás : alapelvek és gyakorlat a C++ használatával  . - Amerikai Egyesült Államok : Addison-Wesley , 2008. - P. 594. - ISBN 0321543726 .
  2. ↑ Gondolkodás C++  nyelven . - Amerikai Egyesült Államok : Alan Apt, 2000. - S. 857. - ISBN 0-13-979809-9 .