Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// ok: для возвращаемого значения и параметра используется тот же тип
template Т foo(Т* p) {
Т tmp = *p; // тип tmp совпадает с типом, на который указывает p
// ...
return tmp;
}
Каждому параметру типа должно предшествовать ключевое слово class
или typename
:
// ошибка: U должно предшествовать либо typename, либо class
template Т calc(const T&, const U&);
В списке параметров шаблона эти ключевые слова имеют одинаковый смысл и применяются взаимозаменяемо. Оба ключевых слова применимы одновременно:
// ok: в списке параметров шаблона нет никакой разницы между ключевыми
// словами typename и class
template calc(const T&, const U&);
Для обозначения параметра типа шаблона интуитивно понятней использовать ключевое слово typename
, а не class
; в конце концов, для фактического типа параметра вполне может быть использован встроенный тип, а не только класс. Кроме того, ключевое слово typename
более точно указывает на то, что следующее за ним имя принадлежит типу. Однако ключевое слово typename
было добавлено в язык С++ как часть стандарта С++, поэтому в устаревших программах, вероятнее всего, осталось исключительно ключевое слово class
.
Кроме параметров типа, в определении шаблона могут быть использованы параметры значения (nontype parameter). Параметр значения представляет значение, а не тип. При определении параметров значения вместо ключевого слова class
или typename
используются имена типов.
При создании экземпляра шаблона такие параметры заменяются значением, предоставленным пользователем или выведенным компилятором. Чтобы компилятор смог создать экземпляр шаблона во время компиляции, эти значения должны быть константными выражениями (см. раздел 2.4.4).
В качестве примера напишем версию функции compare()
, работающую со строковыми литералами. Такие литералы представляют собой массивы типа const char
. Поскольку скопировать массив нельзя, определим параметры как ссылки на массив (раздел 6.2.4). Поскольку необходима возможность сравнивать литералы разных длин, снабдим шаблон двумя параметрами значения. Первый параметр шаблона представляет размер первого массива, а второй — размер второго:
template
int compare(const char (&p1)[N], const char (&p2)[M]) {
return strcmp(p1, p2);
}
При вызове следующей версии функции compare()
компилятор будет использовать размер литералов для создания экземпляра шаблона с размерами, которыми заменяют параметры N
и M
:
compare("hi", "mom")
Не забывайте, что компилятор завершает строковый литерал пустым символом (см. раздел 2.1.3). В результате компилятор создаст такой экземпляр:
int compare(const char (&p1)[3], const char (&p2)[4])
Параметр значения может быть целочисленным типом, указателем, ссылкой на объект (l-значением) или на тип функции. Аргумент, связанный с целочисленным параметром значения, должен быть константным выражением. У аргументов, привязанных к указателю или ссылочному параметру значения, должна быть статическая продолжительность существования (см. главу 12). Нельзя использовать обычный (нестатический) локальный или динамический объект как аргумент шаблона для параметра значения шаблона в виде ссылки или указателя. Параметр-указатель может быть также создан как nullptr
или нулевое константное выражение.
Параметр значения шаблона — это константное значение в определении шаблона. Параметр значения применим там, где требуются константные выражения, например, при определении размера массива.
Аргументы шаблона, используемые для параметров значения, должны быть константными выражениями.
inline
и constexpr
Шаблон функции может быть объявлен как inline
(встраиваемый) или constexpr
, как и обычная функция. Спецификаторы inline
и constexpr
располагаются после списка параметров шаблона, но перед типом возвращаемого значения.
// ok: спецификатор inline следует за списком параметров шаблона
template inline Т min(const Т&, const Т&);
// ошибка: неправильное размещение спецификатора inline
inline template T min(const T&, const T&);

Продемонстрируем два наиболее важных принципа создания обобщенного кода на примере функции compare()
.
• Параметры функций в шаблоне должны быть ссылками на константу.
• При проверке в теле шаблона следует использовать только оператор сравнения <
.
Объявление параметров функций ссылками на константы гарантирует возможность применения функции к типам, которые не допускают копирования. Большинство типов, включая встроенные типы, но исключая указатели unique_ptr
и типы ввода-вывода, а также все использованные ранее библиотечные типы допускают копирование. Но вполне могут встретиться и другие типы, которые не допускают копирования. Сделав параметры ссылками на константы, можно гарантировать применимость таких типов в функции compare()
. Кроме того, если функция compare()
будет применена для больших объектов, такая конструкция позволит избежать копирования и сэкономит время при выполнении.
Некоторые читатели могут подумать, что для сравнения было бы целесообразней использовать оба оператора <
и >
.
// ожидаемое сравнение
if (v1 < v2) return -1;
if (v1 > v2) return 1;
return 0;
Однако написание кода, использующего только оператор <
, снизит требования к типам, которые применимы в функции compare()
. Эти типы должны поддерживать оператор <
, но не обязаны поддерживать оператор >
.
Фактически, если действительно следует обеспечить независимость от типа и переносимость кода, лучше определить свою функцию, используя тип less
(см. раздел 14.8.2):
// версия функции compare(), корректно работающая даже с
// указателями; см. p. 14.8.2
template int compare(const T &v1, const T &v2) {
if (less()(v1, v2)) return -1;
if (less()(v2, v1)) return 1;
return 0;
}
Проблема первоначальной версии в том, что если пользователь вызовет ее с двумя указателями, не указывающими на тот же массив, то результат выполнения кода будет непредсказуем.
При написании кода шаблонов следует постараться минимизировать количество требований, накладываемых на типы аргументов.
Интервал:
Закладка: