Эффективный и современный C++ [Скотт Мейерс] (pdf) читать постранично, страница - 2

-  Эффективный и современный C++  (пер. И. В. Красиков) 12.86 Мб, 306с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Скотт Мейерс

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

изложенного материала.
Эшли Морган Вильяме (Ashley Morgan Williams) готовила отличные обеды у себя
в Lake Oswego Pizzicato. Им (и ей) нет равных.
И более двадцати лет моя жена, Нэнси Л. Урбано (Nancy L. Urbano), как обычно во
время моей работы над новой книгой, терпит мою раздражительность и оказывает мне
всемерную поддержку. В ходе написания книги постоянным напоминанием о том, что за
пределами клавиатуры есть другая жизнь, служила мне наша собака Дарла.

14

Благодарности

Вв еден и е

Если вы - опытный программист на языке программирования С++, как, например,
я, то, наверное, первое, о чем вы подумали в связи с С++ 1 1 , - "Да, да, вот и он - тот же
С++, только немного улучшенный". Но познакомившись с ним поближе, вы, скорее все­
го, были удивлены количеством изменений. Объявления auto, циклы for для диапазо­
нов, лямбда-выражения и rvаluе-ссылки изменили лицо С++, - и это не говоря о новых
возможностях параллельности. Произошли и идиоматические изменения. О и t ypede f
уступили место nullptr и объявлениям псевдонимов. Перечисления получили области
видимости. Интеллектуальные указатели стали предпочтительнее встроенных; переме­
щение объектов обычно предпочтител ьнее их копирования.
Даже без упоминания С++ 14 в С++ 1 1 есть что поизучать.
Что еще более важно, нужно очень многое изучить, чтобы использовать новые воз­
можности эффективно. Если вам нужна базовая информация о "современных" возмож­
ностях С++, то ее можно найти в избытке. Но если вы ищете руководство о том, как
использовать эти возможности для создания правильного, эффективного, сопровождае­
мого и переносимого программного обеспечения, поиск становится более сложным. Вот
здесь вам и пригодится данная книга. Она посвящена не описанию возможностей С++ 1 1
и C++l4, а их эффективному применению.
Информация в книге разбита на отдельные разделы, посвященные тем или иным ре­
комендациям. Вы хотите разобраться в разных видах вывода типов? Или хотите узнать,
когда следует (а когда нет) использовать объявление auto? Вас интересует, почему функ­
ция-член, объявленная как const, должна быть безопасна с точки зрения потоков, как
реализовать идиому Pimpl с использованием st d: : un i que_pt r, почему следует из­
бегать режима захвата по умолчанию в лямбда-выражениях или в чем различие между
st d : : а torniс и volа tilе? Ответы на эти вопросы вы найдете в книге. Более того, эти
ответы не зависят от платформы и соответствуют стандарту. Это книга о переносимом С++.
Разделы книги представляют собой рекомендации, а не жесткие правила, поскольку
рекомендации имеют исключения. Наиболее важной частью каждого раздела является
не предлагаемая в нем рекомендация, а ее обоснование. Прочитав раздел, вы сможете
сами определить, оправдывают ли обстоятельства вашего конкретного проекта отход
от данной рекомендации. Истинная цель книги не в том, чтобы рассказать вам, как надо
поступать или как поступать не надо, а в том, чтобы обеспечить вас более глубоким по­
ниманием, как та или иная концепция работает в С++ 1 1 и С++ 1 4.

Терминоnо r ия и соrnашения
Чтобы мы правильно понимали друг друга, важно согласовать используемую терми­
нологию, начиная, как ни странно это звучит, с термина "С++". Есть четыре официаль­
ные версии С++, и каждая именуется с использованием года принятия соответствующего
стандарта ISO: С++98, С++ОЗ, C++l 1 и С++14. С+ +98 и С++ОЗ отличаются один от друго­
го только техническими деталями, так что в этой книге обе версии я называю как С++98.
Говоря о С++ 1 1 , я подразумеваю и С++ 1 1 , и С++ 1 4, поскольку С++ 14 является надмно­
жеством С++ 1 1 . Когда я пишу "С++ 1 4': я имею в виду конкретно С++ 14. А если я просто
упоминаю С++, я делаю утверждение, которое относится ко всем версиям языка.
Использованный термин

Подразумеваемая версия

(++

Все

(++98

с++98

и

с++03

(++11

(++11

и

(++14

(++14

(++14

В результате я мог бы сказать, что в С++ придается большое значение эффективности
(справедливо для всех версий), в С++98 отсутствует поддержка параллелизма (справед­
ливо только для С++98 и С++ОЗ), С++ 1 1 поддерживает лямбда-выражения (справедливо
для C++l l и С++14) и С++14 предлагает обобщен ный вывод возвращаемого типа функ­
ции (справедливо только для С++ 1 4).
Наиболее важной особенностью С++ 1 1 , вероятно, является семантика перемещения,
а основой семантики перемещения является отличие rvа/ие-выражени й от /vа/uе-выра­
жений. Поэтому rvalue указывают объекты, которые могут быть перемещены, в то время
как lvalue в общем случае перемещены быть не могут. Концептуально (хотя и не всегда
на практике), rvalue соответствуют временным объектам, возвращаемым из функций,
в то время как lvalue соответствуют объектам, на которые вы можете ссылаться по име­
ни, следуя указателю или lvalue-ccылкe.
Полезной эвристикой для выяснения, является ли выражение lvalue, является ответ
на вопрос, можно ли получить его адрес. Если можно, то обычно это lvalue. Если нет, это
обычно rvalue. Приятной