Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
getline()
для чтения целой строкиИногда игнорировать пробелы во вводе не нужно. В таких случаях вместо оператора >>
следует использовать функцию getline()
. Функция getline()
получает поток ввода и строку. Функция читает предоставленный поток до первого символа новой строки и сохраняет прочитанное, исключая символ новой строки, в своем аргументе типа string
. Встретив символ новой строки, даже если это первый символ во вводе, функция getline()
прекращает чтение и завершает работу. Если символ новой строки во вводе первый, то возвращается пустая строка.
Подобно оператору ввода, функция getline()
возвращает свой аргумент типа istream
. В результате функцию getline()
можно использовать в условии, как и оператор ввода (см. раздел 1.4.3). Например, предыдущую программу, которая выводила по одному слову в строку, можно переписать так, чтобы она вместо этого выводила всю строку:
int main() {
string line;
// читать строки до конца файла
while (getline(cin, line))
cout << line << endl;
return 0;
}
Поскольку переменная line
не будет содержать символа новой строки, его придется вывести отдельно. Для этого, как обычно, используется манипулятор endl
, который, кроме перевода строки, сбрасывает буфер вывода.
Символ новой строки, прекращающий работу функции
getline()
, отбрасывается и в строковой переменной не сохраняется .
size()
и empty()
Функция empty()
(пусто) делает то, что и ожидается: она возвращает логическое значение true
(раздел 2.1), если строка пуста, и значение false
— в противном случае. Подобно функции-члену isbn()
класса Sales_item
(см. раздел 1.5.2), функция empty()
является членом класса string
. Для вызова этой функции используем точечный оператор, позволяющий указать объект, функцию empty()
которого необходимо вызвать.
А теперь пересмотрим предыдущую программу так, чтобы она выводила только непустые строки:
// читать ввод построчно и отбрасывать пустые строки
while (getline(cin, line))
if (!line.empty())
cout << line << endl;
Условие использует оператор логического NOT ( оператор !
). Он возвращает инверсное значение своего операнда типа bool
. В данном случае условие истинно, если строка line
не пуста.
Функция size()
возвращает длину строки (т.е. количество символов в ней). Давайте используем ее для вывода строк длиной только больше 80 символов.
string line;
// читать ввод построчно и отображать строки длиной более 80 символов
while (getline(cin, line))
if (line.size() > 80)
cout << line << endl;
string::size_type
Вполне логично ожидать, что функция size()
возвращает значение типа int
, а учитывая сказанное в разделе 2.1.1, вероятней всего, типа unsigned
. Но вместо этого функция size()
возвращает значение типа string::size_type
. Этот тип требует более подробных объяснений.
В классе string
(и нескольких других библиотечных типах) определены вспомогательные типы данных. Эти вспомогательные типы позволяют использовать библиотечные типы машинно-независимым способом. Тип size_type
— это один из таких вспомогательных типов. Чтобы воспользоваться типом size_type
, определенным в классе string
, применяется оператор области видимости (оператор ::
), указывающий на то, что имя size_type
определено в классе string
.
Хотя точный размер типа string::size_type
неизвестен, можно с уверенностью сказать, что этот беззнаковый тип (см. раздел 2.1.1) достаточно большой, чтобы содержать размер любой строки. Любая переменная, используемая для хранения результата операции size()
класса string
, должна иметь тип string::size_type
.
По общему признанию, довольно утомительно вводить каждый раз тип
string::size_type
. По новому стандарту можно попросить компилятор самостоятельно применить соответствующий тип при помощи спецификаторов auto
или decltype
(см. раздел 2.5.2):
auto len = line.size(); // len имеет тип string::size_type
Поскольку функция size()
возвращает беззнаковый тип, следует напомнить, что выражения, в которых смешаны знаковые и беззнаковые данные, могут дать непредвиденные результаты (см. раздел 2.1.2). Например, если переменная n
типа int
содержит отрицательное значение, то выражение s .size() < n
почти наверняка истинно. Оно возвращает значение true
потому, что отрицательное значение переменной n
преобразуется в большое беззнаковое значение.
Проблем преобразования между беззнаковыми и знаковыми типами можно избежать, если не использовать переменные типа
int
в выражениях, где используется функция size()
.
Класс string
определяет несколько операторов для сравнения строк. Эти операторы сравнивают строки посимвольно. Результат сравнения зависит от регистра символов, символы в верхнем и нижнем регистре отличаются.
Операторы равенства ( ==
и !=
) проверяют, равны или не равны две строки соответственно. Две строки равны, если у них одинаковая длина и одинаковые символы. Операторы сравнения ( <
, >
, <=
, >=
) проверяют, меньше ли одна строка другой, больше, меньше или равна, больше или равна другой. Эти операторы используют ту же стратегию, старшинство символов в алфавитном порядке в зависимости от регистра.
1. Если длина у двух строк разная и если каждый символ более короткой строки совпадает с соответствующим символом более длинной, то короткая строка меньше длинной.
2. Если символы в соответствующих позициях двух строк отличаются, то результат сравнения определяется первым отличающимся символом.
Для примера рассмотрим следующие строки:
string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
Согласно правилу 1 строка str
меньше строки phrase
. Согласно правилу 2 строка slang
больше, чем строки str
и phrase
.
Как правило, библиотечные типы столь же просты в применении, как и встроенные. Поэтому большинство библиотечных типов поддерживают присвоение. Строки не являются исключением, один объект класса string
вполне можно присвоить другому.
string st1(10, 'c'), st2; // st1 - сссссссссс; st2 - пустая строка
Интервал:
Закладка: