Liejimo operatoriai C++
Liejimo operatoriai naudojami tipo liejimui C++. Jie naudojami vieno tipo duomenų konvertavimui į kitą. C++ palaiko keturių tipų atkūrimą:
- statinis_perdavimas
- dinaminis_perdavimas
- const_cast
- reinterpret_cast
1. static_cast
The statinis_perdavimas operatorius yra dažniausiai naudojamas liejimo operatorius C++. Jis atlieka kompiliavimo laiko tipo konvertavimą ir daugiausia naudojamas aiškioms konversijoms, kurias kompiliatorius laiko saugiomis.
Static_cast sintaksė
static_cast < new_type>(išraiška);>>kur,
- išraiška: Duomenys, kuriuos reikia konvertuoti.
- new_type: Pageidaujamas išraiškos tipas
Static_cast gali būti naudojamas konvertuoti tarp susijusių tipų, pvz., skaitinių tipų arba rodyklių toje pačioje paveldėjimo hierarchijoje.
Static_cast pavyzdys
C++ // C++ program to illustrate the static_cast #include #include using namespace std; int main() { int num = 10; // converting int to double double numDouble = static_cast (skaičius); // spausdinimo duomenų tipas cout < < typeid(num).name() < < endl; // typecasting cout < < typeid(static_cast (skaičius)).vardas() < < endl; // printing double type t cout < < typeid(numDouble).name() < < endl; return 0; } Išvestis
2. dinaminis_perdavimas
The dinaminis_perdavimas operatorius daugiausia naudojamas atlikti sumažinimą (bazinės klasės rodyklę/nuorodą konvertuoti į išvestinę klasę). Jis užtikrina tipo saugą atlikdamas vykdymo laiko patikrą, kad patikrintų konversijos galiojimą.
dynamic_cast sintaksė
dynamic_cast < new_type>(išraiška);>>
Jei konversija neįmanoma, dinaminis_perdavimas grąžina a nulinis rodyklė (žymiklio konvertavimui) arba metimai a bad_cast išimtis (dėl nuorodų konversijų).
Dynamic_cast pavyzdys
C++ // C++ program to illustrate the dynamic_cast #include using namespace std; // Base Class class Animal { public: virtual void speak() const { cout < < 'Animal speaks.' < < endl; } }; // Derived Class class Dog : public Animal { public: void speak() const override { cout < < 'Dog barks.' < < endl; } }; // Derived Class class Cat : public Animal { public: void speak() const override { cout < < 'Cat meows.' < < endl; } }; int main() { // base class pointer to derived class object Animal* animalPtr = new Dog(); // downcasting Dog* dogPtr = dynamic_cast (gyvūnasPtr); // tikrinama, ar tipo siuntimas sėkmingas if (dogPtr) { dogPtr->speak(); } dar { cout < < 'Failed to cast to Dog.' < < endl; } // typecasting to other dervied class Cat* catPtr = dynamic_cast (gyvūnasPtr); if (catPtr) { catPtr->speak(); } dar { cout < < 'Failed to cast to Cat.' < < endl; } delete animalPtr; return 0; } Išvestis
3. const_cast
The const_cast operatorius naudojamas modifikuoti kintamojo const arba nepastovų kvalifikatorių. Tai leidžia programuotojams laikinai pašalinti objekto pastovumą ir atlikti pakeitimus. Naudodami const_cast reikia būti atsargiems, nes modifikuojant const objektą gali atsirasti neapibrėžtas elgesys.
Const_cast sintaksė
const_cast < new_type>(išraiška);>>
Const_cast pavyzdys
C++ // C++ program to illustrate the const_cast #include using namespace std; int main() { const int number = 5; // Pointer to a const int const int* ptr = &number; // int* nonConstPtr = ptr; if we use this // instead of without using const_cast // we will get error of invalid conversion int* nonConstPtr = const_cast (ptr); *nonConstPtr = 10; cout < < 'Modified number: ' < < *nonConstPtr; return 0; } Išvestis
4. reinterpret_cast
The reinterpret_cast operatorius naudojamas konvertuoti žymeklį į bet kurio kito tipo žymeklį. Ji neatlieka jokio patikrinimo, ar konvertuota rodyklė yra to paties tipo, ar ne.
Reinterpret_cast sintaksė
reinterpret_cast < new_type>(išraiška);>>
Pavyzdys
C++ // C++ program to illustrate the reinterpret_cast #include using namespace std; int main() { int number = 10; // Store the address of number in numberPointer int* numberPointer = &number; // Reinterpreting the pointer as a char pointer char* charPointer = reinterpret_cast (numerio rodyklė); // Atminties adresų ir reikšmių spausdinimas cout < < 'Integer Address: ' < < numberPointer < < endl; cout < < 'Char Address: ' < < reinterpret_cast (charpointer) < < endl; return 0; } Išvestis
Pastaba: const_cast ir reinterpret_cast paprastai nerekomenduojami, nes jie yra pažeidžiami įvairių tipų klaidų.