Static_cast


En operation static_cast i C++ udfører en eksplicit , gyldig cast [1] .

Syntaks:static_cast < type_to > ( object_from )

Koden vil kompilere, hvis der er en måde at konvertere fra object_fromtil type_to.

Eksempel

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

Mulige typekonverteringer

static_castdesignet til at udføre alle former for konverteringer tilladt af compileren [2] . Alle konverteringer virker kun, hvis der er kompatibilitet med og . constvolatile

1. Enhver af de typekonverteringer, som C++ udfører implicit (f.eks. array til pointer, en numerisk type til en anden, -pointer til indtastet, implicit konstruktørinvocation). Eksplicit skriftlig skrivning kan være påkrævet, for eksempel: void*static_cast

  • i skabelonen;
  • for at vælge hvilken version af en funktion eller operation der skal bruges:auto hitRate = static_cast<float>(nHits) / nShots;
  • for at undertrykke compiler-advarslen "Muligt tab af præcision":double a = 1.0; auto b = static_cast<float>(a);
  • for at matche typer i en ternær betinget operation: .Base& x = use1 ? static_cast<Base&>(obj1) : static_cast<Base&>(obj2);

2. Hvis den tilsvarende transformation er markeret med nøgleordet . explicit

3. Konvertering fra/til type . enum class

enum klasse 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. For eksplicit at angive, hvilken af ​​de overbelastede funktioner, der skal tages.

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

5. For at konvertere pointere ned i typehierarkiet uden at kontrollere. I modsætning til C-stil konvertering og , er konvertering til en ikke-relateret klasse ikke mulig. reinterpret_cast

void TSomeForm::someButtonClick ( TObject * sender ) { // C++ Builder begivenhed // Vi ved, at det er en TButton, fordi vi selv indstiller begivenheden // i formulareditoren eller TButton- konstruktøren * bt = static_cast < TButton *> ( sender ); bt -> Billedtekst = L "Klikket!" ; }

Mulige logiske fejlslutninger

Mulige fejl afhænger af, hvilken form for konvertering der udføres. Overløb, uden for rækkevidde og endda (for pointerkonverteringer) hukommelseskorruption er mulige.

For eksempel kan en variabel under konvertering få en ugyldig værdi, og programmet vil ikke være klar til dette. int enum class

Se også

Noter

  1. ↑ Programmering : principper og praksis ved hjælp af C++  . - Amerikas Forenede Stater : Addison-Wesley , 2008. - S. 594. - ISBN 0321543726 .
  2. ↑ Tænker i C++  . - Amerikas Forenede Stater : Alan Apt, 2000. - S. 857. - ISBN 0-13-979809-9 .