Звичайний каст vs. статичний каст vs. динамічний каст
Я пишу код на C та C++ вже майже двадцять років, але є один аспект цих мов, який я ніколи не розумів. Очевидно, що я використовував звичайні приведення, тобто
MyClass *m = (MyClass *)ptr;
скрізь, але, здається, є два інших типи зліпків, і я не знаю різниці. Яка різниця між наступними рядками коду?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
1654
3
Вам слід ознайомитись зі статтею Програмування на C++/Наведення типів.
Вона містить гарний опис усіх різних типів приведення. Наступне взято з вищенаведеного посилання:
Приведення у стилі C об'єднує const_cast, static_cast та reinterpret_cast.
Хотілось би, щоб у C++ не було приведень у стилі C. Приведення у C++ виділяються належним чином (як і повинно бути; приведення зазвичай вказує на те, що ви робите щось погане) і належним чином розрізняють різні види перетворення, які виконують приведення. Вони також дозволяють писати схожі на вигляд функції, наприклад, boost::lexical_cast, що досить добре з точки зору узгодженості.
Оператор
dynamic_cast
має перевірку типу під час виконання і працює тільки з посиланнями та вказівниками, в той час як операторstatic_cast
не має перевірки типу під час виконання. За більш детальною інформацією можна звернутись до статті MSDN Оператор статичного приведення.