Casting Operators v C++

Casting operátory se používají pro typ casting v C++. Používají se k převodu jednoho datového typu na jiný. C++ podporuje čtyři typy přetypování:

  1. static_cast
  2. dynamic_cast
  3. const_cast
  4. reinterpret_cast

1. static_cast

The static_cast Operátor je nejběžněji používaným castingovým operátorem v C++. Provádí převod typu v době kompilace a používá se hlavně pro explicitní převody, které kompilátor považuje za bezpečné.

Syntaxe static_cast

  static_cast    <  new_type>(výraz); 

kde,

  • výraz: Data ke konverzi.
  • nový_typ: Požadovaný typ výrazu

Parametr static_cast lze použít k převodu mezi souvisejícími typy, jako jsou číselné typy nebo ukazatele ve stejné hierarchii dědičnosti.

Příklad static_cast

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 (počet); // tisk datového typu cout < < typeid(num).name()  < < endl; // typecasting cout  < < typeid(static_cast (num)).name() < < endl; // printing double type t cout  < < typeid(numDouble).name()  < < endl; return 0; } 

Výstup
i d d 

V tomto příkladu jsme zahrnuli info o typu knihovnu, abychom ji mohli používat typid() funkce pro kontrolu datového typu. Definovali jsme celočíselnou proměnnou ‚num‘ a převedli ji na double pomocí static_cast. Poté vytiskneme datové typy proměnných a předáme static_cast(num) v typid() funkci pro kontrolu jeho datového typu. můžeme vidět výstup i, d, d je vytištěn kde 'já' označuje celé číslo a 'd' označuje dvojnásobek .

2. dynamic_cast

The dynamic_cast operátor se používá hlavně k provádění downcastingu (převod ukazatele/odkazu na základní třídu na odvozenou třídu). Zajišťuje bezpečnost typu tím, že provádí kontrolu za běhu pro ověření platnosti převodu.

Syntaxe dynamic_cast

  dynamic_cast    <  new_type>(výraz); 

Pokud převod není možný, dynamic_cast vrací a nulový ukazatel (pro převod ukazatelů) nebo vyvolá a výjimka bad_cast (pro referenční konverze).

Příklad dynamic_cast

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 (animalPtr); // kontrola, zda je přetypování úspěšné if (dogPtr) { dogPtr->speak(); } jinak { cout < < 'Failed to cast to Dog.'  < < endl; } // typecasting to other dervied class Cat* catPtr = dynamic_cast (animalPtr); if (catPtr) { catPtr->speak(); } jinak { cout < < 'Failed to cast to Cat.'  < < endl; } delete animalPtr; return 0; } 

Výstup
Dog barks. Failed to cast to Cat. 

Vysvětlení: První řádek výstupu se vytiskne, protože 'animalPtr' z 'Zvíře' typ je úspěšně přetypován do 'Pes' typu a mluvit() funkce třídy Dog je vyvolána, ale obsazení 'Zvíře' zadejte do 'Kočka' typ selhal, protože 'animalPtr' ukazuje na a 'Pes' objektu tedy dynamické přetypování selže, protože typové přetypování není bezpečné.

3. const_cast

The const_cast Operátor se používá k úpravě konst nebo volatile kvalifikátoru proměnné. Umožňuje programátorům dočasně odstranit stálost objektu a provádět úpravy. Při použití const_cast je třeba postupovat opatrně, protože úprava objektu const může vést k nedefinovanému chování.

Syntaxe pro const_cast

  const_cast    <  new_type>(výraz); 

Příklad const_cast

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; } 

Výstup
Modified number: 10 

Ve výše uvedeném příkladu jsme upravili hodnotu the typ const ukazatel změnou jeho kvalifikátoru z konst na nekonst a poté vytisknout upravenou hodnotu.

4. reinterpret_cast

The operátor reinterpret_cast se používá k převodu ukazatele na jakýkoli jiný typ ukazatele. Neprovádí žádnou kontrolu, zda převedený ukazatel je stejného typu nebo ne.

Syntaxe reinterpret_cast

  reinterpret_cast    <  new_type>(výraz); 

Příklad

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 (čísloPointer); // Tisk adres paměti a hodnot cout < < 'Integer Address: '  < < numberPointer  < < endl; cout  < < 'Char Address: '  < < reinterpret_cast (charPointer) < < endl; return 0; } 

Výstup
Integer Address: 0x7fff64789f1c Char Address: 0x7fff64789f1c 

Ve výše uvedeném příkladu jsme definovali proměnnou int 'číslo' a poté uložte adresu „čísla“. ‘numberPointer’ typu int jsme poté převedli ‘numberPointer’ typu int do ukazatele char a poté jej uložte do „charPointer“ variabilní. Abychom ověřili, že jsme vytiskli adresu numberPointer i charPointer. Chcete-li vytisknout adresu uloženou v „charPointer“ reinterpret_cast se používá k obcházení mechanismu kontroly typu v C++ a umožňuje vytištění ukazatele jako generické adresy paměti bez jakékoli typově specifické interpretace.

Poznámka: const_cast a reinterpret_cast se obecně nedoporučují, protože jsou náchylné na různé druhy chyb.