Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14

Здесь есть возможность читать онлайн «Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2016, ISBN: 2016, Издательство: Вильямс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Эффективный и современный С++
В книге рассматриваются следующие темы. Освоение С++11 и С++14 — это больше, чем просто ознакомление с вводимыми этими стандартами возможностями (например, объявлениями типов
, семантикой перемещения, лямбда-выражениями или поддержкой многопоточности). Вопрос в том, как использовать их эффективно, чтобы создаваемые программы были корректны, эффективны и переносимы, а также чтобы их легко можно было сопровождать. Именно этим вопросам и посвящена данная книга, описывающая создание по-настоящему хорошего программного обеспечения с использованием C++11 и С++14 — т.е. с использованием современного С++.
■ Преимущества и недостатки инициализации с помощью фигурных скобок, спецификации
, прямой передачи и функций
интеллектуальных указателей
■ Связь между
,
, rvalue-ссылками и универсальными ссылками
■ Методы написания понятных, корректных,
лямбда-выражений
■ Чем
отличается от
, как они используются и как соотносятся с API параллельных вычислений С++
■ Какие из лучших методов “старого” программирования на С++ (т.е. С++98) должны быть пересмотрены при работе с современным С++
Более чем 20 лет книги
серии
являются критерием уровня книг по программированию на С++. Понятное пояснение сложного технического материала принесло ему всемирную известность. Он всегда самый желанный гость на международных конференциях, а его услуги консультанта широко востребованы во всем мире.
Скотт Мейерс Эффективный и современный С++, После изучения основ С++ я перешел к изучению того, как применять С++ в промышленном программировании, с помощью серии книг Скотта Мейерса Эффективный С++. Эффективный и современный С++ — наиболее важная из книг серии, предлагающая ключевые рекомендации, стили и идиомы, позволяющие эффективно использовать современный С++. Вы еще не купили эту книгу? Сделайте это прямо сейчас. Герб Саттер,
глава Комитета ISO по стандартизации С++, специалист в области архитектуры программного обеспечения на С++ в Microsoft

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Это, конечно, хорошо, но не позвольте теплому сиянию этого хэппи-энда отвлечь вас от истинной цели этого раздела. Эта цель в том, чтобы убедить вас, что всякий раз, когда вы объявляете в производном классе функцию, предназначенную для перекрытия виртуальной функции базового класса, вы не забывали делать это с использованием ключевого слова override.

Кстати, если функция-член использует ссылочный квалификатор, все перегрузки этой функции также должны использовать его. Это связано с тем, что перегрузки без этих квалификаторов могут вызываться как для объектов lvalue, так и для объектов rvalue. Такие перегрузки будут конкурировать с перегрузками, имеющими ссылочные квалификаторы, так что все вызовы функции будут неоднозначными.

Следует запомнить

• Объявляйте перекрывающие функции как override.

• Ссылочные квалификаторы функции-члена позволяют по-разному рассматривать lvalue- и rvalue-объекты ( *this).

3.7. Предпочитайте итераторы const_iteratorитераторам iterator

Итераторы const_iteratorпредставляют собой STL-эквивалент указателя на const. Они указывают на значения, которые не могут быть изменены. Стандартная практика применения constтам, где это только возможно, требует применения const_iteratorвезде, где нужен итератор, но не требуется изменять то, на что этот итератор указывает.

Это верно как для С++98, так и для C++11, но в С++98 поддержка const_iteratorносит половинчатый характер. Такие итераторы не так легко создавать, а если у вас уже имеется такой итератор, его использование весьма ограничено. Предположим, например, что вы хотите выполнить в std::vectorпоиск первого встречающегося значения 1983 (год, когда название языка программирования “С с классами” сменилось на С++), а затем вставить в это место значение 1998 (год принятия первого ISO-стандарта С++). Если в векторе нет значения 1983, вставка выполняется в конец вектора. При использовании итераторов iterator в С++98 сделать описанное просто:

std::vector values;

std::vector::iterator it =

std::find(values.begin(), values.end(), 1983);

values.insert(it, 1998);

Но iterator— в данном случае не совсем верный выбор, поскольку этот код не изменяет объект, на который указывает iterator. Переделка кода для использования const_iteratorдолжна быть тривиальной задачей… но не в С++98. Вот один из подходов, концептуально надежный, но все еще не совсем корректный:

typedef std::vector::iterator IterT;

std::vector::const_iterator ConstIterT;

std::vector values;

ConstlterT ci =

std::find( static_cast(values.begin() ),

static_cast(values.end() ),

1983);

values.insert( static_cast(ci), // Может не

1998); // компилироваться!

Конструкции typedefприменять, конечно, необязательно, но они облегчают написание приведений. (Если вы удивляетесь, почему я использую typedef, а не следую собственному совету из раздела 3.3 и не применяю объявлений псевдонимов, то я напомню, что в этом примере демонстрируется код С++98, а объявления псевдонимов — новая возможность в С++11.)

Приведения в вызове std::findприсутствуют потому, что valuesявляется неконстантным контейнером, а в С++98 нет простого способа получить константный итератор из неконстантного контейнера. Приведения не являются строго необходимыми, так как можно получить const_iteratorдругими способами (например, вы можете связать valuesс переменной, являющейся ссылкой на константный объект, а затем использовать ее в своем коде вместо values), но к какому бы способу вы ни прибегли, процесс получения const_iterator, указывающего на элементы неконстантного контейнера, включает определенное количество “кривизны”.

После того как вы получаете const_iterator, ситуация ничуть не улучшается, поскольку в С++98 местоположения для вставки (и удаления) могут указывать только неконстантные итераторы iterator. Итераторы const_iteratorдля этого неприменимы. Вот почему в приведенном выше коде я выполняю приведение const_iterator(который я с таким трудом получил из std::find) в iterator: передача const_iteratorв функцию insertне будет компилироваться.

Честно говоря, показанный мной код может не скомпилироваться, поскольку не существует переносимого преобразования const_iteratorв iterator, даже с помощью static_cast. Может не сработать даже семантическая кувалда reinterpret_cast. (Это не ограничение С++98. Это справедливо и для C++11. const_iteratorпросто не преобразуется в iterator— неважно, насколько простым кажется такое преобразование.) Есть несколько переносимых способов сгенерировать iterator, который указывает на то же, на что и const_iterator, но они не очевидны, не универсальны и не стоят того, чтобы рассматривать их в данной книге. Кроме того, я надеюсь, что теперь понятна моя позиция: const_iteratorпричиняли так много неприятностей в С++98, что редко стоили того, чтобы о них беспокоиться и их использовать. По большому счету программисты всегда использовали constне где это только возможно , а только там, где это практично , а в С++98 const_iteratorособо практичным не является.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14»

Представляем Вашему вниманию похожие книги на «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14»

Обсуждение, отзывы о книге «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x