|
|
|||||||||||||||||||||||||||||
|
Ещё более современный C++Источник: habrahabrru
Не так давно Герб Саттер открыл на своём сайте новую страничку - Elements of Modern C++ Style, где он описывает преимущества нового стандарта и то, как они повлияют на код. Стандарт C++11 вносит множество новых фич. Далее мы рассмотрим те из них, благодаря которым C++11 можно считать новым языком по сравнению с C++98, т.е.: Не стесняйтесь использовать и другие возможности C++11. Но в первую очередь обратите внимание на те, что перечислены ниже, так как именно благодаря им, на C++11 возможно писать чистый, безопасный и быстрый код - такой же чистый и безопасный, как и в случае других современных языков. Ну и традиционная производительность C++, как всегда, на высоте. auto Используйте ключевое слово auto везде, где это возможно. Во-вторых, так гораздо удобнее в случае, если тип имеет неизвестное или большое и неказистое имя, которое Вы даже произнести не в состоянии. Отметим, что использование auto не меняет смысла Вашего кода. Он по-прежнему статически типизирован, и каждое выражение по-прежнему обладает чётким и ясным типом. Просто язык больше не заставляет Вас повторяться, заново указывая тип. Некоторые люди боятся использования auto, потому как не указывая тип, мы можем получить совсем не то, что ожидаем. Если Вы хотите принудительно приводить типы, то хорошо - указывайте нужный тип. Но в большинстве случаев следует использовать auto: вряд ли Вы получите экземпляр другого типа по ошибке, и даже в этом случае на выручку придёт строгая типизация (компилятор будет ругаться, если Вы, например, попробуете вызвать несуществующий метод). Умные указатели: delete не нужен Всегда используйте стандартные умные указатели и невладеющие сырые указатели. Никогда не используйте владеющие сырые указатели и delete (кроме крайних случаев, вроде реализации низкоуровневой структуры). В общем случае указатель - это shared_ptr, выражающий общее владение. // C++98 Для разрыва циклических связей и выражения опциональности (например, реализации кеша объектов) используйте weak_ptr. В случае, если у указателя должен быть единственный владелец, используйте unique_ptr, предназначенный специально для этого случая. Любое выражение вида "new T" должно немедленно инициализировать другой объект, владеющий им, обычно unique_ptr. Если Вам нужно работать с объектом, который может пережить Вас, используйте сырой указатель. nullptr Всегда используйте для нулевого значения nullptr и никогда 0 или макрос NULL, поскольку они неоднозначны и могут быть как числом, так и указателем. for и range С новым for'ом, умеющим работать с range, перебирать элементы контейнеров стало ещё проще и удобнее. begin и end Всегда используйте begin и end как нечлены, потому что такой подход легко расширяем и позволяет работать со всеми типами контейнеров, а не только теми, которые следуют стилю STL и предоставляют методы .begin() и .end(). Если Вы используйте не-STL коллекцию, которую можно проитерировать, но не реализующую методы .begin() и .end(), Вы можете самостоятельно перегрузить begin и end для неё так, чтобы итерировать эту коллекцию так же, как и контейнеры STL. Такая перегрузка, например, уже реализована для массивов в стиле C. Лямбда функции Благодаря лямбдам Ваш код станет элегантнее и быстрее. С их появлением использовать существующие алгоритмы STL стало проще раз в 100. Новые библиотеки всё чаще полагаются на поддержку лямбда-функций (PPL), а некоторые и вовсе требуют их наличия (C++ AMP). Небольшой пример: найти первый элемент в v, который больше x и меньше y. Обязательно ознакомьтесь с лямбдами. Они уже широко распространены во многих популярных языках. Для начала можно послушать мой доклад Lambdas, Lambdas Everywhere на PDC 2010. Move / && Семантика переноса сильно изменит дизайн наших API. Гораздо чаще станет использоваться возвращение по значению. Если Вы можете сделать что-то более эффективное, чем простое копирование, используйте перемещение. И ещё В современном C++ ещё много хороших вещей. Очень много. И в ближайшем будущем я напишу о них подробнее. Но на текущий момент, всё вышенаписанное - это must-know. Эти фичи лежат в основе современного C++, определяя его стиль. И совсем скоро Вы сможете встретить их практически в каждом кусочке свеженаписанного C++ кода. Именно они делают современный C++ чистым, безопасным и быстрым - таким, которым индустрия будет полагаться долгие годы.
|
|