Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
constexpr
Функция
constexpr
— это функция, которая может быть применена в константном выражении (см. раздел 2.4.4). Функция constexpr
определяется как любая другая функция, но должна соответствовать определенным ограничениям: возвращаемый тип и тип каждого параметра должны быть литералами (см. раздел 2.4.4), тело функции должно содержать только один оператор return
:
constexpr int new_sz() { return 42; }
constexpr int foo = new_sz(); // ok: foo - константное выражение
Здесь функция new_sz
определена как constexpr
, она не получает никаких аргументов. Компилятор может проверить (во время компиляции), что вызов функции new_sz()
возвращает константное выражение, поэтому ее можно использовать для инициализации переменной constexpr
по имени foo
.
Если это возможно, компилятор заменит вызов функции constexpr
ее результирующим значением. Для этого функция constexpr
неявно считается встраиваемой.
Тело функции constexpr
может содержать другие операторы, если они не выполняют действий во время выполнения. Например, функция constexpr
может содержать пустые операторы, псевдонимы типа (см. раздел 2.5.1) и объявления using
.
Функции constexpr
позволено возвратить значение, которое не является константой:
// scale(arg) - константное выражение, если arg - константное выражение
constexpr size_t scale(size_t cnt) { return new_sz() * cnt; }
Функция scale()
возвратит константное выражение, если ее аргумент будет константным выражением, но не в противном случае:
int arr[scale(2)]; // ok: scale(2) - константное выражение
int i = 2; // i - неконстантное выражение
int a2[scale(i)]; // ошибка: scale(i) - неконстантное выражение
Если передать константное выражение (такое как литерал 2
), возвращается тоже константное выражение. В данном случае компилятор заменит вызов функции scale()
результирующим значением.
Если происходит вызов функции scale()
с выражением, которое не является константным (например, объект i
типа int
), то возвращается неконстантное выражение. Если использовать функцию scale()
в контексте, требующем константного выражения, компилятор проверит, является ли результат константным выражением. Если это не так, то компилятор выдаст сообщение об ошибке.
Функция constexpr
не обязана возвращать константное выражение.
constexpr
в файлы заголовкаВ отличие от других функций, встраиваемые функции и функции constexpr
могут быть определены в программе несколько раз. В конце концов, чтобы встроить код, компилятор нуждается в определении, а не только в объявлении. Однако все определения конкретной встраиваемой функции и функции constexpr
должны совпадать точно. В результате встраиваемые функции и функции constexpr
обычно определяют в заголовках.
Упражнение 6.43. Какое из следующих объявлений и определений имеет смысл поместить в файл заголовка, а какой — в текст файла исходного кода? Объясните почему.
(a) inline bool eq(const BigInt&, const BigInt&) {...}
(b) void putValues(int *arr, int size);
Упражнение 6.44. Перепишите функцию isShorter()
из раздела 6.2.2 как встраиваемую.
Упражнение 6.45. Пересмотрите функции, написанные для предыдущих упражнений, и решите, должны ли они быть определены как встраиваемые. Если да, то сделайте это. В противном случае объясните, почему они не должны быть встраиваемыми.
Упражнение 6.46. Возможно ли определить функцию isShorter
как constexpr
? Если да, то сделайте это. В противном случае объясните, почему нет.
6.5.3. Помощь в отладке
Для условного выполнения отладочного кода программисты С++ иногда используют подход, подобный защите заголовка (см. раздел 2.6.3). Идея в том, что программа будет содержать отладочный код, который выполняется только во время разработки программы. Когда приложение закончено и готово к выпуску, отладочный код исключается. Этот подход подразумевает использование двух средств препроцессора: assert
и NDEBUG
.
assert
Макрос assert
— это макрос препроцессора (preprocessor macro). Макрос препроцессора — это переменная препроцессора, действующая как встраиваемая функция. Макрос assert
получает одно выражение и использует его как условие:
assert(выражение);
Если результат выражения ложь (т.е. нуль), то макрос assert
выдает сообщение и закрывает программу. Если результат выражения — истина (т.е. он отличен от нуля), то макрос assert
не делает ничего.
Действие макроса
препроцессора подобно вызову функции. Макрос assert
получает одно выражение , которое он использует как условие.
Макрос assert
определен в заголовке cassert
. Как уже упоминалось, относящиеся к препроцессору имена обрабатывает препроцессор, а не компилятор (см. раздел 2.3.2). В результате такие имена можно использовать непосредственно, без объявления using
. Таким образом, используется имя assert
, а не std::assert
, кроме того, для него не предоставляется объявление using
.
Макрос assert
зачастую используется для проверки "недопустимых" условий. Например, программа обработки вводимого текста могла бы проверять, что все вводимые слова длиннее некоего порогового значения. Эта программа могла бы содержать такой оператор:
assert(word.size() > threshold);
NDEBUG
Поведение макроса assert
зависит от состояния переменной препроцессора NDEBUG
. Если переменная NDEBUG
определена, макрос assert
ничего не делает. По умолчанию переменная NDEBUG
не определена, поэтому по умолчанию макрос assert
выполняет проверку.
Отладку можно "выключить", предоставив директиву #define
, определяющую переменную NDEBUG
. В качестве альтернативы большинство компиляторов предоставляет параметр командной строки, позволяющий определять переменные препроцессора:
$ CC -D NDEBUG main.С # use /D with the Microsoft compiler
Результат будет тот же, что и при наличии строки #define NDEBUG
в начале файла main.С
.
Когда переменная NDEBUG
определена, программа во время выполнения избегает дополнительных затрат на проверку различных условий. Самих проверок во время выполнения, конечно, тоже не будет. Поэтому макрос assert
следует использовать только для проверки того, что действительно недопустимо. Это может быть полезно при отладке программы, но не должно использоваться для замены логических проверок времени выполнения или проверки ошибок, которые должна осуществлять программа.
Интервал:
Закладка: