Оператори приведення в C++
Оператори приведення використовуються для приведення типів у C++. Вони використовуються для перетворення одного типу даних в інший. C++ підтримує чотири типи приведення:
- static_cast
- динамічний_каст
- const_cast
- reinterpret_cast
1. static_cast
The static_cast оператор є найбільш часто використовуваним оператором приведення в C++. Він виконує перетворення типів під час компіляції та в основному використовується для явних перетворень, які компілятор вважає безпечними.
Синтаксис static_cast
static_cast < new_type>(вираз);
де,
- вираз: Дані для перетворення.
- новий_тип: Бажаний тип вираження
Static_cast можна використовувати для перетворення між пов’язаними типами, такими як числові типи або покажчики в одній ієрархії успадкування.
Приклад 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 (кількість); // друк типу даних cout < < typeid(num).name() < < endl; // typecasting cout < < typeid(static_cast (кількість)).name() < < endl; // printing double type t cout < < typeid(numDouble).name() < < endl; return 0; } Вихід
i d d
У цьому прикладі ми включили typeinfo бібліотеку, щоб ми могли використовувати typeid() функція перевірки типу даних. Ми визначили цілочисельну змінну «num» і перетворили її на подвійну за допомогою static_cast. Після цього друкуємо типи даних змінних і передаємо static_cast(кількість) в typeid() перевірити тип даних. ми бачимо, що вихідні дані i, d, d друкуються де «я» позначає ціле число і «д» позначає подвійний .
2. динамічний_каст
The динамічний_каст оператор в основному використовується для виконання низхідного приведення (перетворення покажчика/посилання базового класу на похідний клас). Він забезпечує безпеку типу, виконуючи перевірку під час виконання, щоб перевірити дійсність перетворення.
Синтаксис dynamic_cast
dynamic_cast < new_type>(вираз);
Якщо перетворення неможливе, динамічний_каст повертає a нульовий покажчик (для перетворення вказівників) або кидає a виняток bad_cast (для довідкових перетворень).
Приклад 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); // перевірка успішності приведення типу if (dogPtr) { dogPtr->speak(); } else { cout < < 'Failed to cast to Dog.' < < endl; } // typecasting to other dervied class Cat* catPtr = dynamic_cast (animalPtr); if (catPtr) { catPtr->speak(); } else { cout < < 'Failed to cast to Cat.' < < endl; } delete animalPtr; return 0; } Вихід
Dog barks. Failed to cast to Cat.
Пояснення: Перший рядок виведення друкується, тому що 'animalPtr' з «Тварина» тип успішно приведено до 'Пес' тип і говорити() функція класу Dog викликається, але приведення «Тварина» введіть до «Кіт» типу не вдалося, оскільки 'animalPtr' вказує на a 'Пес' Таким чином, динамічне приведення не вдається, оскільки приведення типів є небезпечним.
3. const_cast
The const_cast Оператор використовується для зміни кваліфікатора const або volatile змінної. Це дозволяє програмістам тимчасово видалити постійність об’єкта та внести зміни. Необхідно бути обережним під час використання const_cast, оскільки зміна об’єкта const може призвести до невизначеної поведінки.
Синтаксис для const_cast
const_cast < new_type>(вираз);
Приклад 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; } Вихід
Modified number: 10
У наведеному вище прикладі ми змінили значення тип const покажчик, змінивши його кваліфікатор з конст до неконст а потім друкує змінене значення.
4. reinterpret_cast
The оператор reinterpret_cast використовується для перетворення покажчика на будь-який інший тип покажчика. Він не перевіряє, чи є перетворений вказівник того самого типу чи ні.
Синтаксис reinterpret_cast
reinterpret_cast < new_type>(вираз);
приклад
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 (numberPointer); // Друк адрес пам'яті та значень cout < < 'Integer Address: ' < < numberPointer < < endl; cout < < 'Char Address: ' < < reinterpret_cast (charPointer) < < endl; return 0; } Вихід
Integer Address: 0x7fff64789f1c Char Address: 0x7fff64789f1c
У наведеному вище прикладі ми визначили змінну int 'номер' а потім збережіть адресу «номера». 'numberPointer' типу int, після чого ми перетворили 'numberPointer' типу int у покажчик char, а потім збережіть його в «charPointer» змінна. Щоб переконатися, що ми надрукували адресу як numberPointer, так і charPointer. Щоб надрукувати адресу, збережену в «charPointer» reinterpret_cast використовується для обходу механізму перевірки типів C++ і дозволяє друкувати покажчик як загальну адресу пам’яті без будь-якої специфічної для типу інтерпретації.
Примітка: const_cast і reinterpret_cast зазвичай не рекомендуються, оскільки вони вразливі до різних типів помилок.