Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
При передаче последовательности значений в параметре типа initializer_list
последовательность следует заключить в фигурные скобки:
// expected и actual - строки
if (expected != actual)
error_msg({"functionX", expected, actual});
else
error_msg({"functionX", "okay"});
Здесь той же функции error_msg()
передаются при первом вызове три значения, а при втором — два.
У функции с параметром initializer_list
могут быть также и другие параметры. Например, у нашей системы отладки мог бы быть класс ErrCode
, представляющий различные виды ошибок. Мы можем пересмотреть свою программу так, чтобы в дополнение к списку initializer_list
передавать параметр типа ErrCode
следующим образом:
void error_msg(ErrCode е, initializer_list il) {
cout << e.msg() << ": ";
for (const auto &elem : il)
cout << elem << " ";
cout << endl;
}
Поскольку класс initializer_list
имеет члены begin()
и end()
, мы можем использовать для обработки элементов серийный оператор for
(см. раздел 5.4.3). Эта программа, как и предыдущая версия, перебирает элементы заключенного в фигурные скобки списка значений, переданных параметру il
.
Для этой версии необходимо пересмотреть вызовы так, чтобы передать аргумент типа ErrCode
:
if (expected != actual)
error_msg(ErrCode(42), {"functionX", expected, actual});
else
error_msg(ErrCode(0), {"functionX", "okay"});

Параметры в виде многоточия предоставляются языком С++ для взаимодействия программам с кодом на языке С, использующим такое средство библиотеки С, как varargs
. В других целях параметр в виде многоточия не следует использовать. Использование varargs
описано в документации компилятора С.
Параметры в виде многоточия должны использоваться только для таких типов, которые есть и у языка С, и у С++. В частности, большинство объектов типа класса копируются неправильно, когда передаются параметру в виде многоточия.
Параметр в виде многоточия может быть только последним элементом в списке параметров и может принять любую из двух форм:
void foo(parm_list, ...);
void foo(...);
Первая форма определяет тип (типы) для нескольких параметров функции foo()
. Контроль типов аргументов, соответствующих определенным параметрам, осуществляется как обычно. Для аргументов, соответствующих параметру в виде многоточия, никакого контроля типов нет. В первой форме запятая после объявления параметра необязательна.
Упражнение 6.27. Напишите функцию, получающую параметр типа initializer_list
и возвращающую сумму элементов списка.
Упражнение 6.28. Во второй версии функции error_msg()
, где у нее есть параметр типа ErrCode
, каков тип элемента в цикле for
?
Упражнение 6.29. При использовании типа initializer_list
в серийном операторе for
использовали бы вы ссылку как управляющую переменную цикла? Объясните почему.
6.3. Типы возвращаемого значения и оператор return
Оператор return
завершает выполнение функции и возвращает управление той функции, которая вызвала текущую. Существуют две формы оператора return:
return
;
return выражение ;
6.3.1. Функции без возвращаемого значения
Оператор return
без значения применим только в такой функции, типом возвращаемого значения которой объявлен void
. Функции, возвращаемым типом которых объявлен void
, необязательно должны содержать оператор return
. В функции типа void
оператор return
неявно размещается после последнего оператора.
Как правило, функции типа void
используют оператор return
для преждевременного завершения выполнения. Это аналогично использованию оператора break
(см. раздел 5.5.1) для выход из цикла. Например, можно написать функцию swap()
, которая не делает ничего, если значения идентичны:
void swap(int &v1, int &v2) {
// если значения равны, их замена не нужна; можно выйти сразу
if (v1 == v2)
return;
// если мы здесь, придется поработать
int tmp = v2;
v2 = v1;
v1 = tmp;
// явно указывать оператор return не обязательно
}
Сначала эта функция проверяет, не равны ли значения, и если это так, то завершает работу. Если значения не равны, функция меняет их местами. После последнего оператора присвоения осуществляется неявный выход из функции.
Функции, для возвращаемого значения которых указан тип void
, вторую форму оператора return
могут использовать только для возвращения результата вызова другой функции, которая возвращает тип void
. Возвращение любого другого выражения из функции типа void
приведет к ошибке при компиляции.
6.3.2. Функции, возвращающие значение
Вторая форма оператора return
предназначена для возвращения результата из функции. Каждый случай возвращения значения типа, отличного от void
, должен возвратить значение. Возвращаемое значение должно иметь тип, либо совпадающий, либо допускающий неявное преобразование (см. раздел 4.11) в тип, указанный для возвращаемого значения функции при определении.
Хотя язык С++ не может гарантировать правильность результата, он способен гарантировать, что каждое возвращаемое функцией значение будет соответствовать объявленному типу. Это может получиться не во всех случаях, компилятор попытается обеспечить возвращение значения и выход только через допустимый оператор return
. Например:
// некорректное возвращение значения, этот код не будет откомпилирован
bool str_subrange(const string &str1, const string &str2) {
// размеры одинаковы: возвратить обычный результат сравнения
if (str1.size() == str2.size())
return str1 == str2; // ok: == возвращает bool
// найти размер меньшей строки; условный оператор см. раздел 4.7
auto size = (str1.size() < str2.size())
? str1.size() : str2.size();
// просмотреть все элементы до размера меньшей строки
for (decltype(size) i = 0; i != size; ++i) {
if (str1[i] != str2[i])
return; // ошибка #1: нет возвращаемого значения; компилятор
// должен обнаружить эту ошибку
}
// ошибка #2: выполнение может дойти до конца функции, так и
// не встретив оператор return
// компилятор может и не обнаружить эту ошибку
}
Интервал:
Закладка: