Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14
- Название:Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2016
- Город:Москва
- ISBN:978-5-8459-2000-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 краткое содержание
В книге рассматриваются следующие темы. Освоение С++11 и С++14 — это больше, чем просто ознакомление с вводимыми этими стандартами возможностями (например, объявлениями типов
, семантикой перемещения, лямбда-выражениями или поддержкой многопоточности). Вопрос в том, как использовать их эффективно, чтобы создаваемые программы были корректны, эффективны и переносимы, а также чтобы их легко можно было сопровождать. Именно этим вопросам и посвящена данная книга, описывающая создание по-настоящему хорошего программного обеспечения с использованием C++11 и С++14 — т.е. с использованием современного С++.
■ Преимущества и недостатки инициализации с помощью фигурных скобок, спецификации
, прямой передачи и функций
интеллектуальных указателей
■ Связь между
,
, rvalue-ссылками и универсальными ссылками
■ Методы написания понятных, корректных,
лямбда-выражений
■ Чем
отличается от
, как они используются и как соотносятся с API параллельных вычислений С++
■ Какие из лучших методов “старого” программирования на С++ (т.е. С++98) должны быть пересмотрены при работе с современным С++
Более чем 20 лет книги
серии
являются критерием уровня книг по программированию на С++. Понятное пояснение сложного технического материала принесло ему всемирную известность. Он всегда самый желанный гость на международных конференциях, а его услуги консультанта широко востребованы во всем мире.
Скотт Мейерс Эффективный и современный С++, После изучения основ С++ я перешел к изучению того, как применять С++ в промышленном программировании, с помощью серии книг Скотта Мейерса Эффективный С++. Эффективный и современный С++ — наиболее важная из книг серии, предлагающая ключевые рекомендации, стили и идиомы, позволяющие эффективно использовать современный С++. Вы еще не купили эту книгу? Сделайте это прямо сейчас. Герб Саттер,
глава Комитета ISO по стандартизации С++, специалист в области архитектуры программного обеспечения на С++ в Microsoft
Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Я называю встроенный указатель, такой как возвращаемый оператором new, обычным указателем (raw pointer). Противоположностью обычному указателю является интеллектуальный указатель (smart pointer). Интеллектуальные указатели обычно перегружают операторы разыменования указателей ( operator->
и operator*
), хотя в разделе 4.3 поясняется, что интеллектуальный указатель std::weak_ptr
является исключением.
Я сделал все возможное, чтобы книга содержала только ясную, точную, полезную информацию, но наверняка есть способы сделать ее еще лучшей. Если вы найдете в книге ошибки любого рода (технические, разъяснительные, грамматические, типографские и т.д.) или если у вас есть предложения о том, как можно улучшить книгу, пожалуйста, напишите мне по адресу emc++@aristeia.com
. В новых изданиях книги ваши замечания и предложения обязательно будут учтены.
Список исправлений обнаруженных ошибок можно найти по адресу http://www.aristeia.com/BookErrata/emc++-errata.html
.
Редакция выражает признательность профессору университета Иннополис E. Зуеву за обсуждения и советы при работе над переводом данной книги.
Вы, читатель этой книги, и есть главный ее критик. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересны любые ваши замечания в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо либо просто посетить наш веб-сайт и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится ли вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас.
Отправляя письмо или сообщение, не забудьте указать название книги и ее авторов, а также свой обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию новых книг. Наши электронные адреса:
E-mail: info@williamspublishing.com
WWW: http://www.williamspublishing.com
Наши почтовые адреса:
в России: 127055, Москва, ул. Лесная, д. 43, стр. 1
в Украине: 03150, Киев, а/я 152
Глава 1
Вывод типов
В С++98 имеется единственный набор правил вывода типов — для шаблонов функций. С++11 немного изменяет этот набор правил и добавляет два новых — для auto
и для decltype
. С++ 14 расширяет контексты использования ключевых слов auto
и decltype
. Все более широкое применение вывода типов освобождает вас от необходимости правильной записи очевидных или излишних типов. Он делает программы на С++ более легко адаптируемыми, поскольку изменение типа в одной точке исходного текста автоматически распространяется с помощью вывода типов на другие точки. Однако он может сделать код более сложным для восприятия, так как выводимые компилятором типы могут не быть настолько очевидными, как вам бы хотелось.
Без ясного понимания того, как работает вывод типов, эффективное программирование на современном С++ невозможно. Просто есть слишком много контекстов, в которых имеет место вывод типа: в вызовах шаблонов функций, в большинстве ситуаций, в которых встречается ключевое слово auto
, в выражениях decltype
и, начиная с С++14, там, где применяется загадочная конструкция decltype(auto)
.
Эта глава содержит информацию о выводе типов, которая требуется каждому разработчику на языке программирования С++. Здесь поясняется, как работает вывод типа шаблона, как строится auto
и как проходит свой путь decltype
. Здесь даже объясняется, как заставить компилятор сделать видимыми результаты своего вывода типа, чтобы убедиться, что компилятор выводит именно тот тип, который вы хотели.
1.1. Вывод типа шаблона
Когда пользователи сложной системы не знают, как она работает, но их устраивает то, что она делает, это говорит об удачном проектировании системы. Если мерить такой мерой, то вывод типа шаблона в С++ является огромным успехом. Миллионы программистов передают аргументы шаблонным функциям с вполне удовлетворительными результатами несмотря на то, что многие из этих программистов не способны на большее, чем очень приближенное и расплывчатое описание того, как же были выведены эти типы.
Если вы относитесь к числу этих программистов, у меня для вас две новости — хорошая и плохая. Хорошая новость заключается в том, что вывод типов для шаблонов является основой для одной из наиболее привлекательных возможностей современного С++: auto
. Если вас устраивало, как С++98 выводит типы для шаблонов, вас устроит и то, как С++11 выводит типы для auto
. Плохая новость заключается в том, что когда правила вывода типа шаблона применяются в контексте auto
, они оказываются немного менее интуитивными, чем в приложении к шаблонам. По этой причине важно действительно понимать аспекты вывода типов шаблонов, на которых построен вывод типов для auto
. Этот раздел содержит информацию, которую вы должны знать.
Если вы готовы посмотреть сквозь пальцы на применение небольшого количества псевдокода, то можно рассматривать шаблон функции как имеющий следующий вид:
templateТ>
void( ParamType param);
Вызов может выглядеть следующим образом:
f(expr); // Вызов f с некоторым выражением
В процессе компиляции компилятор использует expr для вывода двух типов: типа Т
и типа ParamType
. Эти типы зачастую различны, поскольку ParamType
часто содержит “украшения”, например const
или квалификаторы ссылки. Например, если шаблон объявлен как
template
void f( const T¶m); // ParamType - const T&
и мы осуществляем вызов
int x = 0;
f( x); // Вызов f с параметром int
то Т
выводится как int
, а ParamType
— как const int&
.
Вполне естественно ожидать, что тип, выведенный для Т
, тот же, что и тип переданного функции аргумента, т.е. что Т
— это тип выражения expr
. В приведенном выше примере это так: x
— значение типа int
и Т
выводится как int
. Но вывод не всегда работает таким образом. Тип, выведенный для T
, зависит не только от типа expr
, но и от вида ParamType
. Существует три случая.
• ParamType
представляет собой указатель или ссылку, но не универсальную ссылку. (Универсальные ссылки рассматриваются в разделе 5.2. Пока что все, что вам надо знать, — что они существуют и не являются ни ссылками lvalue, ни ссылками rvalue.)
• ParamType
является универсальной ссылкой.
• ParamType
не является ни указателем, ни ссылкой.
Интервал:
Закладка: