static_cast C++
„Cast“ operatorius yra a vienetinis operatorius kuris verčia vieną duomenų tipą konvertuoti į kitą duomenų tipą.
C++ palaiko 4 liejimo tipus:
- Statinis aktorius
- Dinaminis perdavimas
- Const Vaid
- Iš naujo interpretuokite aktorių
Šiame straipsnyje pagrindinis dėmesys skiriamas static_cast išsamiai aptarimui.
Statinis aktorius
Tai paprasčiausias gipso tipas, kurį galima naudoti. Tai yra kompiliavimo laikas . Jis atlieka tokius veiksmus kaip numanomas konvertavimas tarp tipų (pvz., int to float arba pointer to void*), taip pat gali iškviesti aiškias konvertavimo funkcijas.
Static_cast sintaksė
static_cast < dest_type>(šaltinis);
Grąžinama static_cast vertė bus iš dest_type.
Static_cast pavyzdys
Žemiau yra C++ programa, skirta įgyvendinti static_cast:
C++
// C++ Program to demonstrate> // static_cast> #include> using> namespace> std;> // Driver code> int> main()> {> > float> f = 3.5;> > // Implicit type case> > // float to int> > int> a = f;> > cout < <> 'The Value of a: '> < < a;> > // using static_cast for float to int> > int> b => static_cast> <> int> >(f);> > cout < <> '
The Value of b: '> < < b;> }> |
Išvestis
The Value of a: 3 The Value of b: 3
Static_cast elgesys įvairiuose scenarijuose
1. static_cast primityviems duomenų tipo rodykliams:
Dabar atlikime keletą aukščiau pateikto kodo pakeitimų.
C++
// C++ Program to demonstrate> // static_cast char* to int*> #include> using> namespace> std;> // Driver code> int> main()> {> > int> a = 10;> > char> c => 'a'> ;> > > // Pass at compile time,> > // may fail at run time> > int> * q = (> int> *)&c;> > int> * p => static_cast> <> int> *>(&c);> > return> 0;> }> |
Išvestis
error: invalid 'static_cast' from type 'int*' to type 'char*'
Paaiškinimas: Tai reiškia, kad net jei manote, kad galite kažkaip perkelti konkretaus objekto žymeklį į kitą, bet tai neteisėta, static_cast neleis jums to padaryti.
2. Objekto konvertavimas naudojant vartotojo nustatytą konvertavimo operatorių
static_cast gali iškviesti klasės konvertavimo operatorių, jei jis yra apibrėžtas. Paimkime kitą objekto konvertavimo į klasę ir iš jos pavyzdį.
Pavyzdys:
C++
// C++ Program to cast> // class object to string> // object> #include> #include> using> namespace> std;> // new class> class> integer {> > int> x;> public> :> > // constructor> > integer(> int> x_in = 0)> > : x{ x_in }> > {> > cout < <> 'Constructor Called'> < < endl;> > }> > // user defined conversion operator to string type> > operator string()> > {> > cout < <> 'Conversion Operator Called'> < < endl;> > return> to_string(x);> > }> };> // Driver code> int> main()> {> > integer obj(3);> > string str = obj;> > obj = 20;> > // using static_cast for typecasting> > string str2 => static_cast> (obj);> > obj => static_cast> (30);> > return> 0;> }> |
Išvestis
Constructor Called Conversion Operator Called Constructor Called Conversion Operator Called Constructor Called
Paaiškinimas: Leidžia pabandyti suprasti aukščiau pateiktą išvestį eilutę po eilutės:
- Kada obj yra sukurtas, tada iškviečiamas konstruktorius, kuris mūsų atveju taip pat yra Conversion Constructor (C++14 taisyklės šiek tiek pakeistos).
- Kai kuriate str iš obj , kompiliatorius nepakels klaidos, kaip apibrėžėme konversijos operatorių.
- Kai padarysi obj = 20 , jūs iš tikrųjų skambinate konversijos kūrėjui.
- Kai padarysi str2 iš statinis_perdavimas , tai gana panašu į eilutę str = obj ; bet su griežta tipo patikra.
- Kai rašai obj = statinis_perdavimas (30) , konvertuojate 30 į an sveikasis skaičius naudojant static_cast.
3. static_cast for Heritance C++
„static_cast“ paveldėjimo atveju gali teikti tiek padidinimą, tiek sumažinimą. Toliau pateiktame pavyzdyje parodytas static_cast naudojimas, kai transliuojama.
Pavyzdys:
C++
// C++ Program to demonstrate> // static_cast in inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived :> public> Base> {};> // Driver code> int> main()> {> > Derived d1;> > > // Implicit cast allowed> > Base* b1 = (Base*)(&d1);> > > // upcasting using static_cast> > Base* b2 => static_cast> (&d1);> > return> 0;> }> |
Paaiškinimas: Aukščiau pateiktas kodas bus sudarytas be klaidų.
- Mes paėmėme d1 adresą ir aiškiai perdavėme jį į bazę ir išsaugojome b1.
- Mes paėmėme d1 adresą ir panaudojome static_cast, kad perkeltume jį į bazę ir išsaugojome b2.
Pirmiau pateiktame pavyzdyje bazinę klasę paveldėjome kaip viešąją. Kas atsitiks, kai paveldėsime jį kaip privatų? Žemiau pateiktas pavyzdys parodo šiuos dalykus:
Pavyzdys:
C++
// C++ program to demonstrate> // static_cast in case of> // private inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived:> private> Base> {> > // Inherited private/protected> > // not public> };> // Driver code> int> main()> {> > Derived d1;> > > // Implicit type cast allowed> > Base* b1 = (Base*)(&d1);> > > // static_cast not allowed> > Base* b2 => static_cast> (&d1);> > return> 0;> }> |
Kompiliavimo laiko klaida:
[Error] 'Base' is an inaccessible base of 'Derived'
Paaiškinimas: Aukščiau pateiktas kodas bus nekompiliuoti net jei paveldėsite kaip apsaugotas .
Taigi, norint naudoti static_cast paveldėjimo atveju, pagrindinė klasė turi būti prieinama, ne virtuali ir nedviprasmiška.
4. static_cast to Cast ‘į ir iš’ tuščiosios rodyklės
Static_cast operatorius leidžia perduoti iš bet kokio tipo rodyklės į tuščią rodyklę ir atvirkščiai.
Pavyzdys:
C++
// C++ program to demonstrate> // static_cast to cast 'to and> // from' the void pointer> #include> using> namespace> std;> // Driver code> int> main()> {> > int> i = 10;> > void> * v => static_cast> <> void> *>(&i);> > int> * ip => static_cast> <> int> *>(v);> > cout < < *ip;> > return> 0;> }> |
Išvestis
10