Полезности современной версии C++
Modern C++ - это в моём понимании всё, что начинается со стандарта C++11. Которому уже, внезапно, аж 9 лет. И вот недавно я решил освежить свои знания этого замечательного ЯП, для чего нашёл и собрал в кучу все интересные лично для меня особенности С++11, C++14 и C++17. Результатом является эта памятка, которая нужна прежде всего именно мне самому для систематизации знаний и в качестве небольшого справочника.
Начнём с нововведений C++11.
1. https://en.cppreference.com/w/cpp/language/static_assert
Начиная с C++11 имеется возможность использовать static_assert (а в C++17 этот механизм упрощён) для проверок на этапе компиляции. А достаточно “умные” среды разработки (например, Visual Studio 2019) делают такие проверки и на этапе редактирования исходного кода.
2. https://en.cppreference.com/w/cpp/language/auto
С помощью автоматического выведения типа можно существенно упростить, например, циклический перебор элементов контейнеров:
3. https://en.cppreference.com/w/cpp/language/function#Deleted_functions
Можно просто и наглядно запретить определённые функции класса, например - дефолтный конструктор.
4. https://en.cppreference.com/w/cpp/language/final
Можно “финализировать” класс или функцию, благодаря чему переопределение или наследование становится невозможным:
5. https://en.cppreference.com/w/cpp/language/override
С помощью ключевого слова override можно явно обозначить намерение переопределения функции. Более строгий контроль за механизмом наследования конечно же полезен.
6. https://en.cppreference.com/w/cpp/language/move_assignment
https://en.cppreference.com/w/cpp/language/move_constructor
https://en.cppreference.com/w/cpp/utility/move
Новые особенности языка позволяют избегать создания промежуточных объектов.
7. https://en.cppreference.com/w/cpp/language/enum
Тип перечисления стал более полезным благодаря возможности явно задать тип значения и ограничить обращение к его элементам необходимостью явно указывать имя перечисления.
8. https://en.cppreference.com/w/cpp/language/user_literal
Определяемые пользователем литералы позволяют сделать код более наглядным, спрятав вызов функции за симпатично выглядящим объявлением.
9. https://en.cppreference.com/w/cpp/language/list_initialization
Инициализация списком упрощает инициализацию контейнеров библиотеки STL (и может быть использована для пользовательских классов тоже).
10. https://en.cppreference.com/w/cpp/language/initializer_list#Delegating_constructor
Теперь один конструктор может вызывать другой.
11. https://en.cppreference.com/w/cpp/language/nullptr
Наконец-то никаких больше макросов NULL и инициализации указателей числом. Теперь для этого имеется специальный тип данных.
12. https://en.cppreference.com/w/cpp/language/types#Character_types
https://en.cppreference.com/w/cpp/language/string_literal
Расширенная поддержка юникода на уровне языковых типов и литералов:
13. https://en.cppreference.com/w/cpp/language/lambda
Одно из самых полезных нововведений. Позволяет объявлять функции именно там, где они необходимы. Хотя злоупотреблять этой возможностью я бы не стал.
14. https://en.cppreference.com/w/cpp/language/range-for
Теперь вместо использования индексов и итераторов можно обойтись такой вот простой и аккуратной конструкцией:
15. https://en.cppreference.com/w/cpp/header/array
Появилась более безопасная и удобная замена массиву в стиле C.
16. https://en.cppreference.com/w/cpp/header/random
Для функции получения случайных чисел теперь существует специализированный заголовочный файл, возможности генерации случайных чисел стали существенно более продвинутыми:
17. https://en.cppreference.com/w/cpp/header/regex
Наконец-то регулярные выражения стали частью стандартной библиотеки!
18. https://en.cppreference.com/w/cpp/thread
https://en.cppreference.com/w/cpp/header/thread
https://en.cppreference.com/w/cpp/header/mutex
https://en.cppreference.com/w/cpp/header/condition_variable
https://en.cppreference.com/w/cpp/header/future
https://en.cppreference.com/w/cpp/atomic
Многопоточность теперь поддерживается стандартной библиотекой. Очень полезное нововведение.
Интересных нововведений в C++14 я нашёл две штуки:
19. https://en.cppreference.com/w/cpp/language/integer_literal
Бинарные литералы позволяют писать числа в двоичном виде:
20. Возможность использовать разделитель в числовых литералах:
Нововведений в C++17 больше (плюс к тому - ранее упомянутое упрощение для static_assert).
21. https://en.cppreference.com/w/cpp/language/attributes
Появился атрибут, указывающий на то, что наличие неиспользуемой сущности не является ошибкой. Больше не нужны макросы типа UNUSED.
22. https://en.cppreference.com/w/cpp/language/namespace
Упрощено объявление вложенных неймспейсов:
23. https://en.cppreference.com/w/cpp/utility/any
Специальный тип данных может хранить значение любого типа:
24. https://en.cppreference.com/w/cpp/header/variant
Больше не нужно изобретать свой тип variant, т.к он появился в стандартной библиотеке.
25. https://en.cppreference.com/w/cpp/header/optional
Опциональные аргументы функций и возвращаемые значения.
26. https://en.cppreference.com/w/cpp/header/string_view
Более удобная и безопасная альтернатива строкам в стиле C.
27. https://en.cppreference.com/w/cpp/header/charconv
Ещё один (вроде бы более быстрый) способ преобразования текста в числа и наоборот.
28. https://en.cppreference.com/w/cpp/algorithm/clamp
Простая функция для лимитирования числа по нижней и верхней границе
29. https://en.cppreference.com/w/cpp/header/filesystem
Полноценная поддержка взаимодействия с файловой системой. Очень много полезного, например - получение списка файлов в каталоге.
Начнём с нововведений C++11.
1. https://en.cppreference.com/w/cpp/language/static_assert
Начиная с C++11 имеется возможность использовать static_assert (а в C++17 этот механизм упрощён) для проверок на этапе компиляции. А достаточно “умные” среды разработки (например, Visual Studio 2019) делают такие проверки и на этапе редактирования исходного кода.
2. https://en.cppreference.com/w/cpp/language/auto
С помощью автоматического выведения типа можно существенно упростить, например, циклический перебор элементов контейнеров:
3. https://en.cppreference.com/w/cpp/language/function#Deleted_functions
Можно просто и наглядно запретить определённые функции класса, например - дефолтный конструктор.
4. https://en.cppreference.com/w/cpp/language/final
Можно “финализировать” класс или функцию, благодаря чему переопределение или наследование становится невозможным:
5. https://en.cppreference.com/w/cpp/language/override
С помощью ключевого слова override можно явно обозначить намерение переопределения функции. Более строгий контроль за механизмом наследования конечно же полезен.
6. https://en.cppreference.com/w/cpp/language/move_assignment
https://en.cppreference.com/w/cpp/language/move_constructor
https://en.cppreference.com/w/cpp/utility/move
Новые особенности языка позволяют избегать создания промежуточных объектов.
7. https://en.cppreference.com/w/cpp/language/enum
Тип перечисления стал более полезным благодаря возможности явно задать тип значения и ограничить обращение к его элементам необходимостью явно указывать имя перечисления.
8. https://en.cppreference.com/w/cpp/language/user_literal
Определяемые пользователем литералы позволяют сделать код более наглядным, спрятав вызов функции за симпатично выглядящим объявлением.
9. https://en.cppreference.com/w/cpp/language/list_initialization
Инициализация списком упрощает инициализацию контейнеров библиотеки STL (и может быть использована для пользовательских классов тоже).
10. https://en.cppreference.com/w/cpp/language/initializer_list#Delegating_constructor
Теперь один конструктор может вызывать другой.
11. https://en.cppreference.com/w/cpp/language/nullptr
Наконец-то никаких больше макросов NULL и инициализации указателей числом. Теперь для этого имеется специальный тип данных.
12. https://en.cppreference.com/w/cpp/language/types#Character_types
https://en.cppreference.com/w/cpp/language/string_literal
Расширенная поддержка юникода на уровне языковых типов и литералов:
13. https://en.cppreference.com/w/cpp/language/lambda
Одно из самых полезных нововведений. Позволяет объявлять функции именно там, где они необходимы. Хотя злоупотреблять этой возможностью я бы не стал.
14. https://en.cppreference.com/w/cpp/language/range-for
Теперь вместо использования индексов и итераторов можно обойтись такой вот простой и аккуратной конструкцией:
15. https://en.cppreference.com/w/cpp/header/array
Появилась более безопасная и удобная замена массиву в стиле C.
16. https://en.cppreference.com/w/cpp/header/random
Для функции получения случайных чисел теперь существует специализированный заголовочный файл, возможности генерации случайных чисел стали существенно более продвинутыми:
17. https://en.cppreference.com/w/cpp/header/regex
Наконец-то регулярные выражения стали частью стандартной библиотеки!
18. https://en.cppreference.com/w/cpp/thread
https://en.cppreference.com/w/cpp/header/thread
https://en.cppreference.com/w/cpp/header/mutex
https://en.cppreference.com/w/cpp/header/condition_variable
https://en.cppreference.com/w/cpp/header/future
https://en.cppreference.com/w/cpp/atomic
Многопоточность теперь поддерживается стандартной библиотекой. Очень полезное нововведение.
Интересных нововведений в C++14 я нашёл две штуки:
19. https://en.cppreference.com/w/cpp/language/integer_literal
Бинарные литералы позволяют писать числа в двоичном виде:
20. Возможность использовать разделитель в числовых литералах:
Нововведений в C++17 больше (плюс к тому - ранее упомянутое упрощение для static_assert).
21. https://en.cppreference.com/w/cpp/language/attributes
Появился атрибут, указывающий на то, что наличие неиспользуемой сущности не является ошибкой. Больше не нужны макросы типа UNUSED.
22. https://en.cppreference.com/w/cpp/language/namespace
Упрощено объявление вложенных неймспейсов:
23. https://en.cppreference.com/w/cpp/utility/any
Специальный тип данных может хранить значение любого типа:
24. https://en.cppreference.com/w/cpp/header/variant
Больше не нужно изобретать свой тип variant, т.к он появился в стандартной библиотеке.
25. https://en.cppreference.com/w/cpp/header/optional
Опциональные аргументы функций и возвращаемые значения.
26. https://en.cppreference.com/w/cpp/header/string_view
Более удобная и безопасная альтернатива строкам в стиле C.
27. https://en.cppreference.com/w/cpp/header/charconv
Ещё один (вроде бы более быстрый) способ преобразования текста в числа и наоборот.
28. https://en.cppreference.com/w/cpp/algorithm/clamp
Простая функция для лимитирования числа по нижней и верхней границе
29. https://en.cppreference.com/w/cpp/header/filesystem
Полноценная поддержка взаимодействия с файловой системой. Очень много полезного, например - получение списка файлов в каталоге.
Comments
Post a Comment