Краткое сравнение С++ 98 и С++ 11
Запись от BinaryBlade размещена 25.05.2023 в 10:27
Краткое сравнение “старого” С++ от “нового” Введение Что же я имею ввиду под определением старый и новый С++ ? На самом деле всё элементарно. У С++ как и у любого другого языка программирования имеются версии релиза – это обусловлено его развитием: добавлением новых функций, расширением стандартной библиотеки, повышением производительности, устранением ошибок предыдущих версий и т.д. Согласно статьям Википедии последняя актуальная и рабочая версия языка, является - C++ 20. В данной статье я не буду говорить про последнюю версию С++. Я хочу отметить наиболее важные и основные отличия С++ 98 и С++ 11. Почему С++ 98 и С++ 11 Вероятно, многие разработчики до сих пор используют исходный стандарт языка С++ 98. Что не удивительно, так как многие обучающие ресурсы (книги, видеоматериалы) или старые проекты, созданные до 2011 года, до сих пор поддерживаются 98-м стандартом. Но язык не стоит на месте, и поэтому на замену с++ 98 пришёл с++ 11, который собрал в себе наиболее важные изменения за всё время существования языка. Именно поэтому я буду делать сравнение между этими версиями. Но к сожалению, я не смогу охватить тот объём информации, который состоит из всех новых возможностей версии с++ 11 и постараюсь отделить всё самое важное и крайне необходимое из этой версии. Поехали! Встроенные типы данных Исходя из таблицы можно заметить, что особой разницы в типе данных не наблюдается.
Ключевое слово auto В 11 версию языка была добавлена возможность использовать ключевое слово auto. auto – позволяет инициализировать тип переменной или лямбда–выражения во время компиляции. Пример:
Ещё одна из важных особенностей auto, это перебор коллекции из любого контейнера STL в цикле for без явного указания типа элемента коллекции:
Удобство:
Список инициализаторов initializer_list initializer_list – является классом, на основе которого можно создать объект, для инициализации элементов массива определенного типa. Пример:
Замечу, что если речь идёт о передаче списка инициализации объектам класса или структуры, то необходимо соблюдать передачу, соответствующую порядку определению членов структуры. Пример:
Удобство:
Ключевое слово typedef и using typedef – используется для определения альтернативного имени типа данных, либо как синоним для спецификации шаблона с указанием всех его параметров, к примеру:
Но для шаблонов такой способ не подойдёт:
И наконец в с++ 11 была добавлена возможность создавать синоним имени шаблона с использованием следующего синтаксиса:
Также для простых типов
Удобство:
Ключевое слово sizeof Удобство:До 11 версии языка, оператор sizeof можно было использовать только для простых типов и объектов. Например, следующая конструкция не сработает для с++ 98 ( и с++ 03):
Нулевой указатель nullptr До появления с++ 11, разработчики использовали в качестве константы нулевого указателя макрос NULL (0), который указывал на область в памяти, где гарантировано отсутствуют какие-либо данные. Проблема заключается в том, что константа 0 играла двойную роль целого числа и нулевого указателя. Это влияло на проектирование кода с использованием перегрузки функции, например:
В С++ 11 эта проблема была решена с помощью константы nullptr:
- Решает проблему с перегрузками функций Ключевое слово constexpr сonstexpr – это спецификатор типа, который гарантирует, что выражение является константным (const). Был добавлен в с++ 11 с целью инициализации константных выражений ( функций,объектов, переменных ) на этапе компиляции, для определения внешних массивов или значений перечислений. Например:
В данном случае код сработает, так как выражение GetSize() + 7 заведомо является константным за счёт использования constexpr. Без указания этого спецификатора, выражение GetSize() + 7 не гарантирует, что оно является константным. То есть компилятору на данный момент неизвестно вернёт ли функция константу или нет. Удобство:
Ключевое слово final С++11 позволяет запрещать в классах-наследниках переопределение определенных методов. Достигается это за счет применения спецификатора final рядом с сигнатурой метода.
Например:
Удобство:
Выражение lambda Лямбда выражения – определяют объект анонимной функции непосредственно в месте, где она и вызывается. Чаще всего такие выражения используют для инкапсуляции данных, передаваемых в какой-либо метод или функцию, откуда она и будет в итоге вызвана в качестве callback. Простой пример:
Более сложный пример:
Удобство:
Умные указатели (std::unique_ptr) И последнее важное новшество в с++ 11 – это умные указатели. Любой программист C++, вероятно, согласится с тем, что одним из самых сложных аспектов языка является ручное управление памятью. Охват всех возможных случаев и путей возврата (включая исключения) может оказаться сложной задачей даже для языковых экспертов, часто с ужасными последствиями утечек памяти или ошибок сегментации. C++11 предоставляет невероятный набор инструментов, позволяющий почти устранить эту проблему, сохраняя при этом мощь и гибкость, которые делают C++ таким замечательным языком. Пример с простым указателем:
Вроде бы всё хорошо, но есть одна проблема. Что произойдёт если ShowText() по каким – либо причинам, выбросит исключение? Тогда управление не дойдёт до delete и память, занятая ptr_obj не освободится. Поэтому сообществом разработчиков с++ было принято решение не использовать delete для ручного освобождения памяти. В следующем примере наглядно демонстрируется использование std::unique_ptr:
Удобство:
Выводы С++ необъятный и постоянно развивающейся язык программирования. В каждой новой версии языка появляется больше возможностей, удобств, средств автоматизаций, алгоритмов, сокращений и т.д. В этой статье конечно же многие детали были опущены и упрощены, для более поверхностного понимания того, как язык может развиваться и меняться. Надеюсь я смог обогатить ваш мозг небольшой крупицей информации по С++. Благодарю за прочтение статьи! |
Всего комментариев 0
Комментарии