#cpp
В чем преимущество преобразователей типов static_cast и dynamic_cast перед старым сишным способом приведения типов и в каких случаях их применение совершенно необходимо, т.е. старый способ приводит к ошибке или невозможен?
Ответы
Ответ 1
struct A { int i; } struct B { float f; } A* a = new A; B* b = (B*)a; b->f = 123.456 При записи значения будет затронута память не принадлежащая переменной класса A, т.к. sizeof(float) > sizeof(int) Такое преобразование не безопасно, поэтому и были добавлены операторы пребразование типов, они перекладывают работу по определению корректно ли преобразование типов с програмиста на компилятор (что не может не радовать=) http://habrahabr.ru/blogs/qt_software/106294/Ответ 2
dynamic_cast необходим, так как он учитывает полиморфизм. Приведения указателей полиморфных типов в стиле C приведут к ошибке. Остальные типы приведения делят функциональность приведения C. Лично я считаю, что нет смысла использовать приведения в стиле C++, так как вероятность таких ошибок очень мала, а код выглядит громоздким. Мою точку зрения доказывают C# и D, в которых есть только одно приведение.Ответ 3
Большее уважение к системе типов. Сишные кастинги ставятся везде одинаково, в си-два-креста -- четыре разных, в зависимости от ситуации. И ещё, как написано у Эккеля, функциональный синтаксис устраняет ошибку определения, к чему же именно применяется кастинг. Хотя и в сишном можно добавить скобок вокруг преобразуемого значения, но этого, как правило, не делают, а тут -- деваться некуда. UPD Тут @GLmonster обратил внимание на dynamic_cast. Это преобразование типобезопасное, при попытке downcasting'а в неподходящий тип будет 0 для указателя и исключение для ссылки (кажется). Утверждение, что сишное преобразование приводит к ошибке мне кажется неверным (если можно преобразовать -- то преобразует, если нельзя -- тоже преобразует. В отличие от dynamic_cast)
Комментариев нет:
Отправить комментарий