Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Новичкам в объектно-ориентированном программировании зачастую трудней всего разобраться в проекте программы. Но как только проект станет абсолютно понятен, его реализация не вызывает проблем. Чтобы проще было понять суть проекта, все используемые в этом примере классы были обобщены в табл. 15.1.
Таблица 15.1. Обзор проекта программы
Классы и операторы интерфейса программы запросов | |
---|---|
TextQuery |
Класс, который читает указанный файл и создает карту поиска. Этот класс предоставляет функцию поиска query() , которая получает строковый аргумент и возвращает объект класса QueryResult , представляющий строки, в которых присутствует ее аргумент (см. раздел 12.3.2) |
QueryResult |
Класс, содержащий результаты вызова функции query() (см. раздел 12.3.2) |
Query |
Класс интерфейса, указывающий на объект типа, производного от класса Query_base |
Query q(s) |
Связывает объект q класса Query с новым объектом класса WordQuery , содержащим строку s |
q1 & q2 |
Возвращает объект класса Query , связанный с новым объектом класса AndQuery , который содержит объекты q1 и q2 |
q1 | q2 |
Возвращает объект класса Query , связанный с новым объектом класса OrQuery , содержащим объекты q1 и q2 |
~q |
Возвращает объект класса Query , связанный с новым объектом класса NotQuery , содержащим объект q |
Классы реализации программы запросов | |
Query_base |
Абстрактный класс, базовый для классов запроса |
WordQuery |
Класс, производный от класса Query_base , который ищет указанное слово |
NotQuery |
Класс, производный от класса Query_base , представляющий набор строк, в которых указанный операнд Query отсутствует |
BinaryQuery |
Абстрактный базовый класс, производный от класса Query_base , который представляет запросы с двумя операндами типа Query |
OrQuery |
Класс, производный от класса BinaryQuery , который возвращает набор номеров строк, в которых присутствует хотя бы один из операндов |
AndQuery |
Класс, производный от класса BinaryQuery , который возвращает набор номеров строк, в которых присутствуют оба операнда |
Упражнение 15.31. При условии, что s1
, s2
, s3
и s4
являются строками укажите, какие объекты создаются в следующих выражениях:
(a) Query(s1) | Query(s2) & ~ Query(s3);
(b) Query(s1) | (Query(s2) & ~ Query(s3));
(c) (Query(s1) & (Query(s2)) | (Query(s3) & Query(s4)));
15.9.2. Классы Query_base
и Query
Начнем реализацию с определения класса Query_base
:
// абстрактный класс, являющийся базовым для конкретных типов запроса;
// все члены закрыты
class Query_base {
friend class Query;
protected:
using line_no = TextQuery::line_no; // используется в функциях eval()
virtual ~Query_base() = default;
private:
// eval() возвращает соответствующий запросу QueryResult
virtual QueryResult eval(const TextQuery&) const = 0;
// rep() строковое представление запроса
virtual std::string rep() const = 0;
};
Обе функции, eval()
и rep()
, являются чистыми виртуальными, что делает класс Query_base
абстрактным базовым (см. раздел 15.4). Поскольку класс Query_base
не предназначен для пользователей и непосредственного использования в производных классах, у него нет открытых членов. Класс Query_base
будет использоваться только через объекты класса Query
. Класс предоставляет дружественные отношения классу Query
, поскольку его члены вызывают виртуальные функции класса Query_base
.
Защищенный член line_no
будет использоваться в функциях eval()
. Деструктор также будет защищен, поскольку он используется (неявно) деструкторами в производных классах.
Query
Класс Query
предоставляет интерфейс к иерархии наследования Query_base
и скрывает ее. Каждый объект класса Query
содержит указатель shared_ptr
на соответствующий объект класса Query_base
. Поскольку класс Query
— единственный интерфейс к классам иерархии Query_base
, он должен определить собственные версии функций eval()
и rep()
.
Конструктор Query()
, получающий строку, создаст новый объект класса WordQuery
и свяжет его указатель-член shared_ptr
с этим недавно созданным объектом. Операторы &
, |
и ~
создают объекты AndQuery
, OrQuery
и NotQuery
соответственно. Эти операторы возвращают объект класса Query
, связанный с созданным им объектом. Для поддержки этих операторов класс Query
нуждается в конструкторе, получающем указатель shared_ptr
на класс Query_base
и сохраняющем его. Сделаем этот конструктор закрытым, поскольку объекты класса Query_base
не предназначены для определения общим пользовательским кодом. Так как этот конструктор является закрытым, операторы следует сделать дружественными.
Исходя из приведенного выше проекта, сам класс Query
довольно прост:
// класс интерфейса для взаимодействия с иерархией
// наследования Query_base
class Query {
// эти операторы должны обращаться к указателю shared_ptr
friend Query operator~(const Query &);
friend Query operator|(const Query&, const Query&);
friend Query operator&(const Query&, const Query&);
public:
Query(const std::string&); // создает новый WordQuery
// функции интерфейса: вызывают соответствующий оператор Query_base
QueryResult eval(const TextQuery &t) const
{ return q->eval(t); }
std::string rep() const { return q->rep(); }
private:
Query(std::shared_ptr query): q(query) { }
std::shared_ptr q;
};
Начнем с объявления дружественных операторов, создающих объекты класса Query
. Эти операторы должны быть друзьями, чтобы использовать закрытый конструктор.
В открытом интерфейсе для класса Query
объявляется, но еще не может быть определен получающий строку конструктор. Этот конструктор создает объект класса WordQuery
, поэтому невозможно определить этот конструктор, пока не определен сам класс WordQuery
.
Два других открытых члена представляют интерфейс для класса Query_base
. В каждом случае оператор класса Query
использует свой указатель класса Query_base
для вызова соответствующей (виртуальный) функции класса Query_base
. Фактически вызываемая версия определяется во время выполнения и будет зависеть от типа объекта, на который указывает указатель q
.

Query
Оператор вывода — хороший пример того, как работает вся система запросов:
Читать дальшеИнтервал:
Закладка: