Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Упражнение 3.30. Выявите ошибки индексации в следующем коде
constexpr size_t array size = 10;
int ia[array_size];
for (size_t ix = 1; ix <= array size; ++ix)
ia[ix] = ix;
Упражнение 3.31. Напишите программу, где определен массив из десяти целых чисел, каждому элементу которого присвоено значение, соответствующее его позиции в массиве.
Упражнение 3.32. Скопируйте массив, определенный в предыдущем упражнении, в другой массив. Перезапишите эту программу так, чтобы использовались векторы.
Упражнение 3.33. Что будет, если не инициализировать массив scores
в программе оценок из данного раздела?
3.5.3. Указатели и массивы
Указатели и массивы в языке С++ тесно связаны. В частности, как будет продемонстрировано вскоре, при использовании массивов компилятор обычно преобразует их в указатель.
Обычно указатель на объект получают при помощи оператора обращения к адресу (см. раздел 2.3.2). По правде говоря, оператор обращения к адресу может быть применен к любому объекту, а элементы в массиве — объекты. При индексировании массива результатом является объект в этой области массива. Подобно любым другим объектам, указатель на элемент массива можно получить из адреса этого элемента:
string nums[] = {"one", "two", "three"}; // массив строк
string *p = &nums[0]; // p указывает на первый элемент массива nums
Однако у массивов есть одна особенность — места их использования компилятор автоматически заменяет указателем на первый элемент.
string *p2 = nums; // эквивалент p2 = &nums[0]
В большинстве выражений, где используется объект типа массива, в действительности используется указатель на первый элемент в этом массиве.
Существует множество свидетельств того факта, что операции с массивами зачастую являются операциями с указателями. Одно из них — при использовании массива как инициализатора переменной, определенной с использованием спецификатора auto
(см. раздел 2.5.2), выводится тип указателя, а не массива.
int ia[] = {0,1,2,3,4,5,6,7,8,9}; // ia - массив из десяти целых чисел
auto ia2(ia); // ia2 - это int*, указывающий на первый элемент в ia
ia2 = 42; // ошибка: ia2 - указатель, нельзя присвоить указателю
// значение типа int
Хотя ia
является массивом из десяти целых чисел, при его использовании в качестве инициализатора компилятор рассматривает это как следующий код:
auto ia2(&ia[0]); // теперь ясно, что ia2 имеет тип int*
Следует заметить, что это преобразование не происходит, если используется спецификатор decltype
(см. раздел 2.5.3). Выражение decltype(ia)
возвращает массив из десяти целых чисел:
// ia3 - массив из десяти целых чисел
decltype(ia) ia3 = {0,1,2,3,4,5,6,7,8,9};
ia3 = p; // ошибка: невозможно присвоить int* массиву
ia3[4] = i; // ok: присвоить значение i элементу в массиве ia3
Указатели, содержащие адреса элементов в массиве, обладают дополнительными возможностями, кроме описанных в разделе 2.3.2. В частности, указатели на элементы массивов поддерживают те же операции, что и итераторы векторов или строк (см. раздел 3.4). Например, можно использовать оператор инкремента для перемещения с одного элемента массива на следующий:
int arr[] = {0,1,2,3,4,5,6,7,8,9};
int *p = arr; // p указывает на первый элемент в arr
++p; // p указывает на arr[1]
Подобно тому, как итераторы можно использовать для перебора элементов вектора, указатели можно использовать для перебора элементов массива. Конечно, для этого нужно получить указатели на первый элемент и элемент, следующий после последнего. Как упоминалось только что, указатель на первый элемент можно получить при помощи самого массива или при обращении к адресу первого элемента. Получить указатель на следующий элемент после последнего можно при помощи другого специального свойства массива. Последний элемент массива arr
находится в позиции 9, а адрес несуществующего элемента массива, следующего после него, можно получить так:
int *е = &arr[10]; // указатель на элемент после
// последнего в массиве arr
Единственное, что можно сделать с этим элементом, так это получить его адрес, чтобы инициализировать указатель е
. Как и итератор на элемент после конца (см. раздел 3.4.1), указатель на элемент после конца не указывает ни на какой элемент. Поэтому нельзя ни обратиться к его значению, ни прирастить.
Используя эти указатели, можно написать цикл, выводящий элементы массива arr
.
for (int *b = arr; b != e; ++b)
cout << *b << endl; // вывод элементов arr
begin()
и end()
Указатель на элемент после конца можно вычислить, но этот подход подвержен ошибкам. Чтобы облегчить и обезопасить использование указателей, новая библиотека предоставляет две функции:
begin()
и end()
. Эти функции действуют подобно одноименным функциям-членам контейнеров (см. раздел 3.4.1). Однако массивы — не классы, и данные функции не могут быть функциями-членами. Поэтому для работы они получают массив в качестве аргумента.
int ia[] = {0,1,2,3,4,5,6,7,8,9}; // ia - массив из десяти целых чисел
int *beg = begin(ia); // указатель на первый элемент массива ia
int *last = end(ia); // указатель на следующий элемент ia за последним
Функция begin()
возвращает указатель на первый, а функция end()
на следующий после последнего элемент данного массива. Эти функции определены в заголовке iterator
.
Используя функции begin()
и end()
, довольно просто написать цикл обработки элементов массива. Предположим, например, что массив arr
содержит значения типа int
. Первое отрицательное значение в массиве arr
можно найти следующим образом:
// pbeg указывает на первый, a pend на следующий после последнего
// элемент массива arr
int *pbeg = begin(arr), *pend = end(arr);
// найти первый отрицательный элемент, остановиться, если просмотрены
// все элементы
while (pbeg != pend && *pbeg >= 0)
++pbeg;
Код начинается с определения двух указателей типа int
по имени pbeg
и pend
. Указатель pbeg
устанавливается на первый элемент массива arr
, a pend
— на следующий элемент после последнего. Условие цикла while
использует указатель pend
, чтобы узнать, безопасно ли обращаться к значению указателя pbeg
. Если указатель pbeg
действительно указывает на элемент, выполняется проверка результата обращения к его значению на наличие отрицательного значения. Если это так, то условие ложно и цикл завершается. В противном случае указатель переводится на следующий элемент.
Интервал:
Закладка: