Оператори приведення використовуються для приведення типів у 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 зазвичай не рекомендуються, оскільки вони вразливі до різних типів помилок.