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