Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// константный объект
Как уже упоминалось в разделе 2.3.3, проще всего понять эти объявления, читая их справа налево. В данном случае ближе всего к имени curErr
расположен спецификатор const
, означая, что сам объект curErr
будет константным. Тип этого объекта формирует остальная часть оператора объявления. Следующий символ оператора объявления, *
, означает, что curErr
— это константный указатель. И наконец, объявление завершает базовый тип, означая, что curErr
— это константный указатель на объект типа int
. Аналогично pip
— это константный указатель на объект типа const double
.
Тот факт, что указатель сам является константой, ничто не говорит о том, можем ли мы использовать указатель для изменения основного объекта. Возможность изменения объекта полностью зависит от типа, на который указывает указатель. Например, pip
— это константный указатель на константу. Ни значение объекта, на который указывает указатель pip
, ни хранящийся в нем адрес не могут быть изменены. С другой стороны, указатель curErr
имеет простой, неконстантный тип int
. Указатель curErr
можно использовать для изменения значения переменной errNumb
:
*pip = 2.72; // ошибка: pip - указатель на константу
// если значение объекта, на который указывает указатель curErr
// (т.е. errNumb), отлично от нуля
if (*curErr) {
errorHandler();
*curErr = 0; // обнулить значение объекта, на который
// указывает указатель curErr
}
Упражнение 2.27. Какие из следующих инициализаций допустимы? Объясните почему.
(a) int i = -1, &r = 0; (b) int *const p2 = &i2;
(c) const int i = -1, &r = 0; (d) const int *const p3 = &i2;
(e) const int *p1 = &i2; (f) const int &const r2;
(g) const int i2 = i, &r = i;
Упражнение 2.28. Объясните следующие определения. Какие из них недопустимы?
(a) int i, *const cp; (b) int *p1, *const p2;
(c) const int ic, &r = ic; (d) const int *const p3;
(e) const int *p;
Упражнение 2.29. С учетом переменных из предыдущих упражнений, какие из следующих присвоений допустимы? Объясните почему.
(a) i = ic; (b) pi = p3;
(с) pi = ⁣ (d) p3 = ⁣
(e) p2 = pi; (f) ic = *p3;
2.4.3. Спецификатор
const
верхнего уровня
Как уже упоминалось, указатель — это объект, способный указывать на другой объект. В результате можно сразу сказать, является ли указатель сам константой и являются ли константой объекты, на которые он может указывать. Термин спецификатор const
верхнего уровня (top-level const
) используется для обозначения того ключевого слова const
, которое объявляет константой сам указатель. Когда указатель способен указывать на константный объект, это называется спецификатор const
нижнего уровня (low-level const
).
В более общем смысле спецификатор const
верхнего уровня означает, что объект сам константа. Спецификатор const
верхнего уровня может присутствовать в любом типе объекта, будь то один из встроенных арифметических типов, тип класса или ссылочный тип. Спецификатор const
нижнего уровня присутствует в базовом типе составных типов, таких как указатели или ссылки. Обратите внимание, что ссылочные типы, в отличие от большинства других типов, способны иметь спецификаторы const
как верхнего, так и нижнего уровня, независимо друг от друга.
int i = 0;
int *const pi = &i; // нельзя изменить значение pi;
// const верхнего уровня
const int ci = 42; // нельзя изменить ci; const верхнего уровня
const int *p2 = &ci; // нельзя изменить p2; const нижнего уровня
const int *const p3 = p2; // справа const верхнего уровня, слева нет
const int &r = ci; // const в ссылочных типах всегда нижнего уровня
Различие между спецификаторами
const
верхнего и нижнего уровней проявляется при копировании объекта. При копировании объекта спецификатор const
верхнего уровня игнорируется.
i = ci; // ok: копирование значения ci; спецификатор const верхнего
// уровня в ci игнорируется
p2 = p3; // ok: указываемые типы совпадают; спецификатор const верхнего
// уровня в p3 игнорируется
Копирование объекта не изменяет копируемый объект. Поэтому несущественно, является ли копируемый или копирующий объект константой.
Спецификатор const
нижнего уровня, напротив, никогда не игнорируется. При копировании объектов у них обоих должны быть одинаковые спецификаторы const
нижнего уровня, или должно быть возможно преобразование между типами этих двух объектов. Как правило, преобразование неконстанты в константу возможно, но не наоборот.
int *p = p3; // ошибка: p3 имеет const нижнего уровня, а p - нет
p2 = p3; // ok: p2 имеет то же const нижнего уровня, что и p3
p2 = &i; // ok: преобразование int* в const int* возможно
int &r = ci; // ошибка: невозможно связать обычную int& с
// объектом const int
const int &r2 = i; // ok: const int& можно связать с обычным int
У указателя p3
есть спецификатор const
нижнего и верхнего уровня. При копировании указателя p3
можно проигнорировать его спецификатор const
верхнего уровня, но не тот факт, что он указывает на константный тип. Следовательно, нельзя использовать указатель p3
для инициализации указателя p
, который указывает на простой (неконстантный) тип int
. С другой стороны, вполне можно присвоить указатель p3
указателю p2
. У обоих указателей тот же тип (спецификатор const
нижнего уровня). Тот факт, что p3
— константный указатель (т.е. у него есть спецификатор const
верхнего уровня), не имеет значения.
Упражнение 2.30. Укажите по каждому из следующих объявлений, имеет ли объявляемый объект спецификатор const
нижнего или верхнего уровня.
const int v2 = 0;
int v1 = v2;
int *p1 = &v1, &r1 = v1;
const int *p2 = &v2, *const p3 = &i, &r2 = v2;
Упражнение 2.31. С учетом объявлений в предыдущем упражнении укажите, допустимы ли следующие присвоения. Объясните, как спецификатор const
верхнего или нижнего уровня применяется в каждом случае.
r1 = v2;
p1 = p2; р2 = p1;
p1 = p3; p2 = p3;
2.4.4. Переменные
constexpr
и константные выражения
Константное выражение (constant expression) — это выражение, значение которого не может измениться и вычисляется во время компиляции. Литерал — это константное выражение. Константный объект, инициализируемый константным выражением, также является константным выражением. Вскоре мы увидим, что в языке есть несколько контекстов, требующих константных выражений.
Читать дальшеИнтервал:
Закладка: