Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Упражнение 6.21. Напишите функцию, получающую значение типа int
и указатель на тип int
, а возвращающую значение типа int
, если оно больше, или значение, на которое указывает указатель, если больше оно. Какой тип следует использовать для указателя?
Упражнение 6.22. Напишите функцию, меняющую местами два указателя на тип int
.
Упражнение 6.23. Напишите собственные версии каждой из функций print()
, представленных в этом разделе. Вызовите каждую из этих функций для вывода i
и j
, определенных следующим образом:
int i = 0, j[2] = {0, 1};
Упражнение 6.24. Объясните поведение следующей функции. Если в коде есть проблемы, объясните, где они и как их исправить.
void print(const int ia[10]) {
for (size_t i = 0; i != 10; ++i)
cout << ia[i] << endl;
}
6.2.5. Функция main()
: обработка параметров командной строки
Функция main()
— хороший пример того, как программы на языке С++ передают массивы в функции. До сих пор функция main()
в примерах определялась с пустым списком параметров.
int main() { ... }
Но зачастую функции main()
необходимо передать аргументы. Обычно аргументы функции main()
используют для того, чтобы позволить пользователю задать набор параметров, влияющих на работу программы. Предположим, например, что функция main()
программы находится в исполняемом файле по имени prog
. Параметры программе можно передавать следующим образом:
prog -d -о ofile data0
Так, параметры командной строки передаются функции main()
в двух (необязательных) параметрах:
int main(int argc, char *argv[]) { ... }
Второй параметр, argv
, является массивом указателей на символьные строки в стиле С, а первый параметр, argc
, передает количество строк в этом массиве. Поскольку второй параметр является массивом, функцию main()
, в качестве альтернативы, можно определить следующим образом:
int main(int argc, char **argv) { ... }
Обратите внимание: указатель argv
указывает на тип char*
. При передаче аргументов функции main()
первый элемент массива argv
содержит либо имя программы, либо является пустой строкой. Последующие элементы передают аргументы, предоставленные в командной строке. Элемент сразу за последним указателем гарантированно будет нулем.
С учетом предыдущей командной строки argc
содержит значение 5, a argv
— следующие символьные строки в стиле С:
argv[0] = "prog"; // может также указывать на пустую строку
argv[1] = "-d";
argv[2] = "-o";
argv[3] = "ofile";
argv[4] = "data0";
argv[5] = 0;
При использовании аргументов в массиве
argv
помните, что дополнительные аргументы начинаются с элемента argv[1]
; элемент argv[0]
содержит имя программы, а не введенный пользователем параметр.
Упражнение 6.25. Напишите функцию main()
, получающую два аргумента. Конкатенируйте предоставленные аргументы и выведите полученную строку.
Упражнение 6.26. Напишите программу, которая способна получать параметры командной строки, описанные в этом разделе. Отобразите значения аргументов, переданных функции main()
.
6.2.6. Функции с переменным количеством параметров
Иногда количество аргументов, подлежащих передаче функции, неизвестно заранее. Например, могла бы понадобиться функция, выводящая сообщения об ошибках, созданные нашей программой. Нам хотелось бы использовать одну функцию, чтобы выводить эти сообщения единообразным способом. Однако различные вызовы этой функции могли бы передавать разные аргументы, соответствующие разным видам сообщений об ошибках.
Новый стандарт предоставляет два основных способа создания функций, получающих переменное количество аргументов: если у всех аргументов тот же тип, можно передать объект библиотечного класса initializer_list
. Если типы аргументов разные, можно написать функцию специального вида, известную как шаблон с переменным количеством аргументов (variadic template), который мы рассмотрим в разделе 16.4.
В языке С++ есть также специальный тип параметра, многоточие, применяющийся для передачи переменного количества аргументов. Мы кратко рассмотрим параметры в виде многоточия далее в этом разделе. Но следует заметить, что это средство обычно используют только в программах, которые должны взаимодействовать с функциями С.
initializer_list
Функцию, получающую произвольное количество аргументов одинакового типа, можно написать, используя параметр типа
initializer_list
. Тип initializer_list
— это библиотечный класс, который представляет собой массив (см. раздел 3.5) значений определенного типа. Этот тип определен в заголовке initializer_list
. Операции, предоставляемые классом initializer_list
, перечислены в табл. 6.1.
Таблица 6.1. Операции, предоставляемые классом initializer_list
initializer_list lst; |
Инициализация по умолчанию; пустой список элементов типа T |
initializer_list lst{a,b,с...}; |
lst имеет столько элементов, сколько инициализаторов; элементы являются копиями соответствующих инициализаторов. Элементы списка — константы |
lst2(lst) lst2 = lst |
Копирование или присвоение объекта класса. initializer_list не копирует элементы в списке. После копирования первоисточник и копия совместно используют элементы |
lst.size() |
Количество элементов в списке |
lst.begin() lst.end() |
Возвращает указатель на первый и следующий после последнего элементы lst |
Подобно типу vector
, тип initializer_list
является шаблоном (см. раздел 3.3). При определении объекта класса initializer_list
следует указать тип элементов, которые будет содержать список:
initializer_list ls; // initializer_list строк
initializer_list li; // initializer_list целых чисел
В отличие от вектора, элементы списка initializer_list
всегда константы; нет никакого способа изменить значение его элементов.
Функцию отображения сообщений об ошибках с переменным количеством аргументов можно написать следующим образом:
void error_msg(initializer_list il) {
for (auto beg = il.begin(); beg != il.end(); ++beg)
cout << *beg << " ";
cout << endl;
}
Методы begin()
и end()
объектов класса initializer_list
аналогичны таковым у класса vector
(см. раздел 3.4.1). Метод begin()
предоставляет указатель на первый элемент списка, а метод end()
— на следующий элемент после последнего. Наша функция инициализирует переменную beg
указателем на первый элемент и перебирает все элементы списка initializer_list
. В теле цикла осуществляется обращение к значению beg
, что позволяет получить доступ к текущему элементу и вывести его значение.
Интервал:
Закладка: