Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Упражнение 2.35. Укажите типы, выведенные в каждом из следующих определений. Затем напишите программу, чтобы убедиться в своей правоте.
const int i = 42;
auto j = i; const auto &k = i; auto *p = &i;
const auto j2 = i, &k2 = i;
2.5.3. Спецификатор типа
decltype
Иногда необходимо определить переменную, тип которой компилятор выводит из выражения, но не использовать это выражение для инициализации переменной. Для таких случаев новый стандарт вводит спецификатор типа
decltype
, возвращающий тип его операнда. Компилятор анализирует выражение и определяет его тип, но не вычисляет его результат.
decltype(f()) sum = x; // sum имеет тот тип,
// который возвращает функция f
Здесь компилятор не вызывает функцию f()
, но он использует тип, который возвратил бы такой вызов для переменной sum
. Таким образом, компилятор назначает переменной sum
тот же тип, который был бы возвращен при вызове функции f()
.
Таким образом, спецификатор decltype
учитывает спецификатор const
верхнего уровня и ссылки, но несколько отличается от того, как работает спецификатор auto
. Когда выражение, к которому применен спецификатор decltype
, является переменной, он возвращает тип этой переменной, включая спецификатор const
верхнего уровня и ссылки.
const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x имеет тип const int
decltype(cj) y = x; // y имеет тип const int& и связана с x
decltype(сj) z; // ошибка: z - ссылка, она должна быть инициализирована
Поскольку cj
— ссылка, decltype (cj)
— ссылочный тип. Как и любую другую ссылку, ссылку z
следует инициализировать.
Следует заметить, что спецификатор decltype
— единственный контекст, в котором переменная определена, поскольку ссылка не рассматривается как синоним объекта, на который она ссылается.

decltype
и ссылкиКогда спецификатор decltype
применяется к выражению, которое не является переменной, получаемый тип соответствует типу выражения. Как будет продемонстрировано в разделе 4.1.1, некоторые выражения заставят спецификатор decltype
возвращать ссылочный тип. По правде говоря, спецификатор decltype
возвращает ссылочный тип для выражений, результатом которых являются объекты, способные стоять слева от оператора присвоения.
// decltype выражение может быть ссылочным типом
int i = 42, *p = &i, &r = i;
decltype(r + 0) b; // ok: сложение возвращает тип int; b имеет тип int
// (не инициализирована)
decltype(*p) с; // ошибка: с имеет тип int& и требует инициализации
Здесь r
— ссылка, поэтому decltype(r)
возвращает ссылочный тип. Если необходим тип, на который ссылается ссылка r
, можно использовать ее в таком выражении, как r + 0
, поскольку оно возвращает значение не ссылочного типа.
С другой стороны, оператор обращения к значению — пример выражения, для которого спецификатор decltype
возвращает ссылку. Как уже упоминалось, при обращении к значению указателя возвращается объект, на который он указывает. Кроме того, этому объекту можно присвоить значение. Таким образом, decltype(*p)
выведет тип int&
, а не просто int
.
Еще одно важное различие между спецификаторами
decltype
и auto
в том, что выведение, осуществляемое спецификатором decltype
, зависит от формы данного выражения . Не всегда понимают то, что включение имени переменной в круглые скобки влияет на тип, возвращаемый спецификатором decltype
. При применении спецификатора decltype
к переменной без круглых скобок получается тип этой переменной. Если заключить имя переменной в одни или несколько круглых скобок, то компилятор будет рассматривать операнд как выражение. Переменная — это выражение, которое способно быть левым операндом присвоения. В результате спецификатор decltype
для такого выражения возвратит ссылку.
// decltype переменной в скобках - всегда ссылка
decltype((i)) d; // ошибка: d - int& и должна инициализироваться
decltype(i) e; // ok: e имеет тип int (не инициализирована)
Помните, что спецификатор
decltype(( переменная ))
(обратите внимание на парные круглые скобки) всегда возвращает ссылочный тип, а спецификатор decltype( переменная )
возвращает ссылочный тип, только если переменная является ссылкой.
Упражнение 2.36. Определите в следующем коде тип каждой переменной и значения, которые будет иметь каждая из них по завершении.
int а = 3, b = 4;
decltype(а) с = а;
decltype((b)) d = а;
++c;
++d;
Упражнение 2.37. Присвоение — это пример выражения, которое возвращает ссылочный тип. Тип — это ссылка на тип левого операнда. Таким образом, если переменная i
имеет тип int
, то выражение i = x
имеет тип int&
. С учетом этого определите тип и значение каждой переменной в следующем коде:
int а = 3, b = 4;
decltype(а) с = а;
decltype(а = b) d = а;
Упражнение 2.38. Опишите различия выведения типа спецификаторами decltype
и auto
. Приведите пример выражения, где спецификаторы auto
и decltype
выведут тот же тип, и пример, где они выведут разные типы.
2.6. Определение собственных структур данных
На самом простом уровне структура данных (data structure) — это способ группировки взаимосвязанных данных и стратегии их использования. Например, класс Sales_item
группирует ISBN книги, количество проданных экземпляров и выручку от этой продажи. Он предоставляет также набор операций, таких как функция isbn()
и операторы >>
, <<
, +
и +=
.
В языке С++ мы создаем собственные типы данных, определяя класс. Такие библиотечные типы, как string
, istream
и ostream
, определены как классы, подобно типу Sales_item
в главе 1. Поддержка классов в языке С++ весьма обширна, фактически части III и IV в значительной степени посвящены описанию средств, связанных с классами. Хотя класс Sales_item
довольно прост, мы не сможем определить его полностью, пока не узнаем в главе 14, как писать собственные операторы.
2.6.1 Определение типа
Sales_data
Несмотря на то что мы еще не можем написать свой класс Sales_item
полностью, уже вполне можно создать достаточно реалистичный класс, группирующий необходимые элементы данных. Стратегия использования этого класса заключается в том, что пользователи будут получать доступ непосредственно к элементам данных и смогут самостоятельно реализовать необходимые операции.
Интервал:
Закладка: