Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Значения, используемые для индексирования строк, не должны быть отрицательными и не должны превосходить размер строки (
>= 0
и < size()
). Результат использования индекса вне этого диапазона непредсказуем. Непредсказуема также индексация пустой строки.
Значение оператора индексирования называется индексом (index). Индекс может быть любым выражением, возвращающим целочисленное значение. Если у индекса будет знаковый тип, то его значение преобразуется в беззнаковый тип size_type
(см. раздел 2.1.2).
Следующий пример использует оператор индексирования для вывода первого символа строки:
if (!s.empty()) // удостоверившись, что символ для вывода есть,
cout << s[0] << endl; // вывести первый символ строки s
Прежде чем обратиться к символу, удостоверимся, что строка s
не пуста. При каждом использовании индексирования следует проверять наличие значения в данной области. Если строка s
пуста, то значение s[0]
неопределенно.
Если строка не константа (см. раздел 2.4), возвращенному оператором индексирования символу можно присвоить новое значение. Например, первый символ можно перевести в верхний регистр следующим образом:
string s("some string");
if (!s.empty()) // удостовериться в наличии символа s[0]
s[0] = toupper(s[0]); // присвоить новое значение первому символу
Вывод этой программы приведен ниже.
Some string
В следующем примере переведем в верхний регистр первое слово строки s
:
// обрабатывать символы строки s, пока они не исчерпаются или
// не встретится пробел
for (decltype(s.size()) index = 0;
index != s.size() && !isspace(s[index]); ++index)
s[index] = toupper(s[index]); // преобразовать в верхний регистр
Вывод этой программы таков:
SOME string
Цикл for
(см. раздел 1.4.2) использует переменную index
для индексирования строки s
. Для присвоения переменной index
соответствующего типа используется спецификатор decltype
. Переменную index
инициализируем значением 0
, чтобы первая итерация началась с первого символа строки s
. На каждой итерации значение переменной index
увеличивается, чтобы получить следующий символ строки s
. В теле цикла текущий символ переводится в верхний регистр.
В условии цикла for
используется новая часть — оператор логического AND ( оператор &&
). Этот оператор возвращает значение true
, если оба операнда истинны, и значение false
в противном случае. Важно то, что этот оператор гарантирует обработку своего правого операнда, только если левый операнд истинен. В данном случае это гарантирует, что индексирования строки s
не будет, если переменная index
находится вне диапазона. Таким образом, часть s[index]
выполняется, только если переменная index
не равна s.size()
. Поскольку инкремент переменной index
никогда не превзойдет значения s.size()
, переменная index
всегда будет меньше s.size()
.
При использовании индексирования следует самому позаботиться о том, чтобы индекс оставался в допустимом диапазоне. Индекс должен быть >= 0
и < size()
строки. Для упрощения кода, использующего индексирование, в качестве индекса всегда следует использовать переменную типа string::size_type
. Поскольку это беззнаковый тип, индекс не может быть меньше нуля. При использовании значения типа size_type
в качестве индекса достаточно проверять только то, что значение индекса меньше значения, возвращаемого функцией size()
.
Библиотека не обязана проверять и не проверяет значение индекса. Результат использования индекса вне диапазона непредсказуем.
В предыдущем примере преобразования регистра символов последовательности индекс перемещался на одну позицию за раз. Но можно также вычислить индекс и непосредственно обратиться к выбранному символу. Нет никакой необходимости получать доступ к символам последовательно.
Предположим, например, что имеется число от 0 до 15, которое необходимо представить в шестнадцатеричном виде. Для этого можно использовать строку, инициализированную шестнадцатью шестнадцатеричными цифрами.
const string hexdigits = "0123456789ABCDEF"; // возможные
// шестнадцатеричные цифры
cout << "Enter a series of numbers between 0 and 15"
<< " separated by spaces. Hit ENTER when finished: "
<< endl;
string result; // будет содержать результирующую
// шестнадцатеричную строку
string::size_type n; // содержит введенное число
while (cin >> n)
if (n < hexdigits.size()) // игнорировать недопустимый ввод
result += hexdigits[n]; // выбрать указанную
// шестнадцатеричную цифру
cout << "Your hex number is: " << result << endl;
Если ввести следующие числа:
12 0 5 15 8 15
то результат будет таким:
Your hex number is: C05F8F
Программа начинается с инициализации строки hexdigits
, содержащей шестнадцатеричные цифры от 0
до F
. Сделаем эту строку константной (см. раздел 2.4), поскольку содержащиеся в ней значения не должны изменяться. Для индексирования строки hexdigits
используем в цикле введенное значение n
. Значением hexdigits[n]
является символ, расположенный в позиции n
строки hexdigits
. Например, если n
равно 15
, то результат — F
; если 12
, то результат — С
и т.д. Полученная цифра добавляется к переменной result
, которая и выводится, когда весь ввод прочитан.
Всякий раз, когда используется индексирование, следует позаботиться о том, чтобы индекс оставался в диапазоне. В этой программе индекс, n
, имеет тип string::size_type
, который, как известно, является беззнаковым. В результате значение переменной n
гарантированно будет больше или равно 0
. Прежде чем использовать переменную n
для индексирования строки hexdigits
, удостоверимся, что ее значение меньше, чем hexdigits.size()
.
Упражнение 3.6. Используйте серийный оператор for
для замены всех символов строки на X
.
Упражнение 3.7. Что будет, если определить управляющую переменную цикла в предыдущем упражнении как имеющую тип char
? Предскажите результат, а затем измените программу так, чтобы использовался тип char
, и убедитесь в своей правоте.
Интервал:
Закладка: