Static_cast


O operație static_cast în C++ realizează o distribuție explicită și validă [1] .

Sintaxă:static_cast < type_to > ( object_from )

Codul se va compila dacă există o modalitate de a converti de object_fromla în type_to.

Exemplu

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

Posibile conversii de tip

static_castconceput pentru a efectua tot felul de conversii permise de compilator [2] . Toate conversiile funcționează numai dacă există compatibilitate cu și . constvolatile

1. Oricare dintre conversiile de tip pe care C++ le efectuează implicit (de exemplu, matrice la pointer, un tip numeric la altul, -pointer la tipat, invocare implicită a constructorului). Poate fi necesară scrierea explicită , de exemplu:void*static_cast

  • în șablon;
  • pentru a alege ce versiune a unei funcții sau operațiuni să folosești:auto hitRate = static_cast<float>(nHits) / nShots;
  • pentru a suprima avertismentul compilatorului „Posibilă pierdere de precizie”:double a = 1.0; auto b = static_cast<float>(a);
  • pentru a potrivi tipuri într-o operație condițională ternară: .Base& x = use1 ? static_cast<Base&>(obj1) : static_cast<Base&>(obj2);

2. Dacă transformarea corespunzătoare este marcată cu cuvântul cheie . explicit

3. Conversie din/la tip . enum class

enum class TriBool { FAL , TRU , UNDEF , NN }; enum { TriBool_N = static_cast < int > ( TriBool :: NN ) }; const char * triBoolNames [ TriBool_N ] = { "false" , "adevărat" , ​​"undef" }; auto x = TriBool :: TRU ; std :: cout << triBoolNames [ static_cast < int > ( x )] << std :: endl ;

4. Pentru a indica în mod explicit care dintre funcțiile supraîncărcate să fie preluată.

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

5. Pentru a converti pointerii în jos în ierarhia tipurilor fără verificarea tipului. Spre deosebire de conversia în stil C și , conversia într-o clasă fără legătură nu este posibilă. reinterpret_cast

void TSomeForm::someButtonClick ( TObject * expeditor ) { // Eveniment C++ Builder // Știm că este un TButton pentru că am setat evenimentul noi înșine // în editorul de formulare sau constructorul TButton * bt = static_cast < TButton *> ( sender ); bt -> Legendă = L "Clic!" ; }

Posibile erori logice

Erorile posibile depind de tipul de conversie efectuată. Sunt posibile depășiri, în afara intervalului și chiar (pentru conversiile pointerului) coruperea memoriei.

De exemplu, în timpul conversiei, o variabilă poate obține o valoare nevalidă și programul nu va fi pregătit pentru aceasta. int enum class

Vezi și

Note

  1. ↑ Programare : principii și practică folosind C++  . - Statele Unite ale Americii : Addison-Wesley , 2008. - P. 594. - ISBN 0321543726 .
  2. ↑ Gândirea în C++  . - Statele Unite ale Americii : Alan Apt, 2000. - S. 857. - ISBN 0-13-979809-9 .