Звичайний каст vs. статичний каст vs. динамічний каст

Я пишу код на C та C++ вже майже двадцять років, але є один аспект цих мов, який я ніколи не розумів. Очевидно, що я використовував звичайні приведення, тобто

MyClass *m = (MyClass *)ptr;

скрізь, але, здається, є два інших типи зліпків, і я не знаю різниці. Яка різниця між наступними рядками коду?

MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);

Вам слід ознайомитись зі статтею Програмування на C++/Наведення типів.

Вона містить гарний опис усіх різних типів приведення. Наступне взято з вищенаведеного посилання:

const_cast (вираз) const_cast(вираз) Функція const_cast() використовується для додавання/видалення константності (або волатильності) змінної. Приклад static_cast Статичне приведення змінної; static_cast(вираз) Функція static_cast() використовується для приведення між цілими типами, наприклад, char - long, int - short і т.д.

Статичне приведення також використовується для приведення покажчиків на споріднені типи, для прикладу, приведення void* до відповідного типу.

динамічне приведення; динамічне_приведення динамічне приведення Динамічне приведення використовується для перетворення покажчиків та посилань під час виконання програми, як правило, з метою приведення покажчика або посилання вгору або вниз ланцюжок успадкування (ієрархія успадкування). Існує два види динамічного кастингу динамічне_приведення(вираз)

Цільовий тип повинен бути покажчиком або типом-посиланням, а вираз вираз повинен обчислюватись до покажчика або посилання. Динамічне приведення працює тільки тоді, коли тип об'єкту, на який посилається вираз сумісний з цільовим типом і базовий клас має хоча б одну віртуальну функцію-член. Якщо ні, і тип виразу, що приводиться є покажчик, то повертається NULL, якщо динамічне приведення за посиланням не вдається, то генерується виключення bad_cast. Якщо динамічне приведення не є помилковим, то воно повертає покажчик приведення повертає покажчик або посилання цільового типу на об'єкт на який посилається вираз. У випадку, коли вираз не вдається переінтерпретувати; переінтерпретувати_приведення повертає покажчик на об'єкт або посилання на об'єкт, на який посилається вираз; Переінтерпретувати приведення просто побітно приводить один тип до іншого. Будь-який покажчик або інтегральний тип може бути приведений до будь-якого іншого з допомогою переінтерпретованого приведення, що легко дозволяє зловживати. Наприклад, з допомогою приведення з переінтерпретацією можна небезпечно привести цілочисельний покажчик до покажчика на рядок.

Коментарі (0)

Приведення у стилі C об'єднує const_cast, static_cast та reinterpret_cast.

Хотілось би, щоб у C++ не було приведень у стилі C. Приведення у C++ виділяються належним чином (як і повинно бути; приведення зазвичай вказує на те, що ви робите щось погане) і належним чином розрізняють різні види перетворення, які виконують приведення. Вони також дозволяють писати схожі на вигляд функції, наприклад, boost::lexical_cast, що досить добре з точки зору узгодженості.

Коментарі (0)

Оператор dynamic_cast має перевірку типу під час виконання і працює тільки з посиланнями та вказівниками, в той час як оператор static_cast не має перевірки типу під час виконання. За більш детальною інформацією можна звернутись до статті MSDN Оператор статичного приведення.

Коментарі (0)