Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Инкапсуляция обеспечивает разделение интерфейса и реализации класса. Инкапсулируемый класс скрывает свою реализацию от пользователей, которые могут использовать интерфейс, но не имеют доступа к реализации класса.
Класс, использующий абстракцию данных и инкапсуляцию, называют абстрактным типом данных (abstract data type). Внутренняя реализация абстрактного типа данных заботит только его разработчика. Программисты, которые используют этот класс, не обязаны ничего знать о том, как внутренне работает этот тип. Они могут рассматривать его как абстракцию .
7.1. Определение абстрактных типов данных
Класс Sales_item
, использованный в главе 1, является абстрактным типом данных. При использовании объекта класса Sales_item
задействовался его интерфейс (т.е. операции, описанные в разделе 1.5.1). Мы не имели доступа к переменным-членам, хранящимся в объекте класса Sales_item
. На самом деле нам даже не было известно, какие переменные-члены имеет этот класс.
Наш класс Sales_data
(см. раздел 2.6.1) не был абстрактным типом данных. Он позволяет пользователям обращаться к его переменным-членам и вынуждает пользователей писать собственные операции. Чтобы сделать класс Sales_data
абстрактным типом, необходимо определить операции, доступные для его пользователей. Как только класс Sales_data
определит собственные операции, мы сможем инкапсулировать (т.е. скрыть) его переменные-члены.
7.1.1. Разработка класса Sales_data
В конечном счете хочется, чтобы класс Sales_data
поддержал тот же набор операций, что и класс Sales_item
. У класса Sales_item
была одна функция-член (member function) (см. раздел 1.5.2) по имени isbn
, а также поддерживались операторы +
, =
, +=
, <<
и >>
.
Определение собственных операторов рассматривается в главе 14, а пока определим обычные (именованные) функции для этих операций. По причинам, рассматриваемым в разделе 7.1.5, функции, осуществляющие сложение и операции ввода-вывода, не будут членами класса Sales_data
. Мы определим эти функции как обычные. Функция, выполняющая составное присвоение, будет членом класса, и по причинам, рассматриваемым в разделе 7.1.5, наш класс не должен определять присвоение.
Таким образом, интерфейс класса Sales_data
состоит из следующих операций.
• Функция-член isbn()
, возвращающая ISBN объекта.
• Функция-член combine()
, добавляющая один объект класса Sales_data
к другому.
• Функция add()
, суммирующая два объекта класса Sales_data
.
• Функция read()
, считывающая данные из потока istream
в объект класса Sales_data
.
• Функция print()
, выводящая значение объекта класса Sales_data
в поток ostream
.
Пользователями (user) программисты обычно называют людей, использующих их приложения. Аналогично разработчик класса реализует его для пользователей класса. В данном случае пользователем является другой программист, а не конечный пользователь приложения.
Когда упоминается пользователь , имеющееся в виду лицо определяет контекст употребления термина. Если речь идет о пользовательском коде или пользователе класса Sales_data
, то подразумевается программист, который использует класс. Если речь идет о пользователе приложения книжного магазина, то подразумевается менеджер склада, использующий приложение.
Говоря о пользователях , программисты С++, как правило, имеют в виду как пользователей приложения, так и пользователей класса.
В простых приложениях пользователь класса вполне может быть и его разработчиком. Но даже в таких случаях имеет смысл различать роли. Разрабатывая интерфейс класса, следует думать о том, чтобы его было проще использовать. При использовании класса не нужно думать, как именно он работает.
Авторы хороших приложений добиваются успеха потому, что понимают и реализуют потребности пользователей. Точно так же хорошие разработчики класса обращают пристальное внимание на потребности программистов, которые будут использовать их класс. У хорошо разработанного класса удобный, интуитивно понятный интерфейс, а его реализация достаточно эффективна для решения задач пользователя.
Sales_data
Прежде чем думать о реализации нашего класса, обдумаем то, как можно использовать функции его интерфейса. В качестве примера использования этих функций напишем новую версию программы книжного магазина из раздела 1.6, работающую с объектами класса Sales_data
, а не Sales_item
:
Sales_data total; // переменная для хранения текущей суммы
if (read(cin, total)) { // прочитать первую транзакцию
Sales_data trans; // переменная для хранения данных следующей
// транзакции
while(read(cin, trans)) { // читать остальные транзакции
if (total.isbn() == trans.isbn()) // проверить isbn
total.combine(trans); // обновить текущую сумму
else {
print(cout, total) << endl; // отобразить результаты
total = trans; // обработать следующую книгу
}
}
print(cout, total) << endl; // отобразить последнюю транзакцию
} else { // ввода нет
cerr << "No data?!" << endl; // уведомить пользователя
}
Сначала определяется объект класса Sales_data
для хранения текущей суммы. В условии оператора if
происходит вызов функции read()
для чтения в переменную total
первой транзакции. Это условие работает, как и другие написанные ранее циклы с использованием оператора >>
. Как и оператор >>
, наша функция read()
будет возвращать свой потоковый параметр, который и проверяет условие (см. раздел 4.11.2). Если функция read()
потерпит неудачу, сработает часть else
, выводящая сообщение об ошибке.
Если данные прочитаны успешно, определяем переменную trans
для хранения всех транзакций. Условие цикла while
также проверяет поток, возвращенный функцией read()
. Пока операции ввода в функции read()
успешны, условие выполняется и обрабатывается следующая транзакция.
В цикле while
происходит вызов функции-члена isbn()
объектов total
и trans
, возвращающей их ISBN. Если объекты total
и trans
относятся к той же книге, происходит вызов функции combine()
, добавляющей компоненты объекта trans
к текущей сумме, хранящейся в объекте total
. Если объект trans
представляет новую книгу, происходит вызов функции print()
, выводящей итог по предыдущей книге. Поскольку функция print()
возвращает ссылку на свой потоковый параметр, ее результат можно использовать как левый операнд оператора <<
. Это сделано для того, чтобы вывести символ новой строки после результата, созданного функцией print()
. Затем объект trans
присваивается объекту total
, начиная таким образом обработку записи следующей книги в файле.
Интервал:
Закладка: