У цій статті ми розглянемо основні 4 типи операторів приведення типів, їх корисність та як компілятор їх реалізує. Цей посібник короткий, чіткий і лаконічний, включаючи всю необхідну інформацію про кожен тип.
Static_cast
Використання static_cast для перетворень типів на етапі компіляції
Основною метою static_cast
є виконання перетворень типів на етапі компіляції, забезпечуючи, що перетворення є дійсним і безпечним на основі відомих типів.
Компілятор перетворює один тип в інший без перевірок під час виконання програми. Тому використання staticcast між пов’язаними типами вважається безпечним, наприклад, підвищення типу в ієрархії класів або перетворення між основними типами даних. Однак спроба використати staticcast для операцій по зниженню типу може призвести до проблем, оскільки ми не можемо бути впевнені, що вказівник або посилання на базовий клас фактично вказує на об'єкт похідного класу.
reinterpret_cast
Використання reinterpret_cast для перетворення вказівників під час серіалізації та десеріалізації
Серіалізація використовується для перетворення об'єкта в формат, який можна легко зберігати або передавати, а потім відновити (Десеріалізація) пізніше.
reinterpret_cast може перетворювати будь-який вказівник на будь-який інший тип даних. Однак цільовий тип повинен бути здатний (достатньо великим) зберігати бінарне подання вказівника без втрати інформації. Тому ми використовуємо або uintptr_t, або intptr_t типи даних для безпечного зберігання адреси, на яку вказує вказівник.
Використовуючи reinterpret_cast, комп’ютер бере бінарне подання адреси пам'яті, що міститься у вказівнику, і інтерпретує його як тип uintptr_t
(або intptr_t), через перетворення з двійкового в десятковий формат.
dynamic_cast
Використання dynamic_cast для ідентифікації типу під час виконання та безпечного зниження типу в ієрархії класів
У C++ dynamic_cast в основному використовується для безпечного зниження типу під час виконання. На відміну від підвищення типу, зниження типу є більш ризикованим, оскільки об'єкт базового класу не обов'язково є допустимим об'єктом похідного класу.
dynamic_cast
виконує перевірку під час виконання, щоб перевірити, чи є перетворення дійсним. Він не змінює тип об'єкта, до якого ми виконуємо перетворення, але якщо перетворення недійсне, він повертає nullptr
для вказівників або викидає виключення std::bad_cast
для посилань.
dynamic_cast
покладається на RTTI (RunTime Type Information), що є особливістю C++, яка відстежує тип поліморфних об'єктів під час виконання. Компілятор генерує RTTI для поліморфних класів, тому важливо мати хоча б одну віртуальну функцію при роботі з dynamic_cast.
dynamic_cast
перевіряє, чи вказує Variable
на об'єкт типу TargetType
. Якщо так, перетворення успішне, і умова істинна. Якщо ж Variable
не вказує на об'єкт типу TargetType
, перетворення не вдається, і умова хибна.
const_cast
Використання const_cast для додавання або видалення кваліфікаторів const або volatile
Цей тип приведення використовується, коли потрібно змінити константність або волатильність вказівника чи посилання без зміни основного типу. Це означає, що цільовий тип має бути таким самим, як і вихідний тип.
Це корисно, коли потрібно викликати неконстантну членську функцію на константному об'єкті або передати константний об'єкт у функцію, яка очікує неконстантний параметр.
Перекладено з: Deep Understanding of The 4 Type Casting Operators in C++