Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Кроме классов животных, здесь можно определить дополнительные классы, которые инкапсулируют различные абстракции, например, животных, подвергающихся опасности. В данной реализации класс Panda(Панда) будет получен в результате множественного наследования от классов Bearи Endangered(Подвергающийся опасности).
18.3.1. Множественное наследование
Список наследования производного класса может содержать несколько базовых классов:
class Bear : public ZooAnimal { /* ... */ };
class Panda : public Bear, public Endangered { /* ... */ };
У каждого базового класса есть необязательный спецификатор доступа (см. раздел 15.5). Как обычно, если спецификатор доступа отсутствует, по умолчанию подразумевается спецификатор private(закрытый), если используется ключевое слово class, и public(открытый), если используется ключевое слово struct(см. раздел 15.5).
Как и при одиночным наследовании, список наследования может включить только те классы, которые были определены и не были определены как final(см. раздел 15.2.2). Язык С++ не налагает никаких ограничений на количество базовых классов, из которых может быть получен производный класс. Однако базовый класс может присутствовать в списке наследования только один раз.
При множественном наследовании объект производного класса внутренне содержит объекты каждого из своих базовых классов (см. раздел 15.2.2). Например, на рис. 18.2 у объекта Pandaесть часть класса Bear(которая сама содержит часть ZooAnimal), часть класса Endangeredи нестатические переменные-члены, если таковые имеются, объявленные в пределах класса Panda.
Рис. 18.2. Концептуальная структура объекта класса Panda
Создание объекта производного класса подразумевает создание и инициализацию внутренних объектов всех его базовых классов. В случае одиночного наследования из (единого) базового класса (см. раздел 15.2.2) в списке инициализации конструктора производного класса можно передать значения только для прямых базовых классов:
// явная инициализация объектов обоих базовых классов
Panda::Panda(std::string name, bool onExhibit)
: Bear(name, onExhibit, "Panda"),
Endangered(Endangered::critical) { }
// неявное применение стандартного конструктора класса Bear для
// инициализации его внутреннего объекта
Panda::Panda()
: Endangered(Endangered::critical) { }
Список инициализации конструктора позволяет передать аргументы каждому из прямых базовых классов, однако порядок выполнения конструкторов (constructor order) зависит от порядка их расположения в списке наследования класса. Порядок их расположения в списке инициализации конструктора не имеет значения. Объект класса Pandaинициализируется следующим образом.
• Внутренний объект класса ZooAnimal, самого первого базового класса иерархии класса Panda, непосредственного базового для класса Bearсоздается первым.
• Внутренний объект класса Bear, первого непосредственного базового класса для класса Panda, инициализируется следующим.
• Внутренний объект класса Endangered, второго непосредственного базового класса для класса Panda, инициализируется следующим.
• Последней инициализируется наиболее производная часть класса Panda.
По новому стандарту производный класс может наследовать свои конструкторы от одного или нескольких своих базовых классов (см. раздел 15.7.4). Нельзя наследовать тот же конструктор (т.е. конструктор с тем же списком параметров) от более чем одного базового класса:
struct Base1 {
Base1() = default;
Base1(const std::string&);
Base1(std::shared_ptr);
};
struct Base2 {
Base2() = default;
Base2(const std::string&);
Base2(int);
};
// ошибка: D1 пытается унаследовать D1::D1(const string&) от обоих
// базовых классов
struct D1: public Base1, public Base2 {
using Base1::Base1; // наследует конструкторы от Base1
using Base2::Base2; // наследует конструкторы от Base2
};
Класс, унаследовавший тот же конструктор от нескольких базовых классов, должен определить собственную версию этого конструктора:
struct D2: public Base1, public Base2 {
using Base1::Base1; // наследует конструкторы от Base1
using Base2::Base2; // наследует конструкторы от Base2
// D2 должен определить собственный конструктор, получающий string
D2(const string &s) : Base1(s), Base2(s) { }
D2() = default; // необходимо, поскольку D2 определяет собственный
// конструктор
};
Как обычно, деструктор в производном классе отвечает за освобождение ресурсов, зарезервированных этим классом. Автоматически освобождаются члены только производного класса и всех базовых классов. Тело синтезируемого деструктора пусто.
Деструкторы всегда выполняются в порядке, обратном вызову конструкторов. В данном примере порядок вызова деструкторов будет следующим: ~Panda(), ~Endangered(), ~Bear(), ~ZooAnimal().
Как и в случае одиночного наследования, классы с несколькими базовыми классами, определяющими собственные конструкторы копирования, перемещения и операторы присвоения, должны копировать, перемещать и присваивать весь объект (см. раздел 15.7.2). Базовые части класса, производного от нескольких базовых, автоматически копируются, перемещаются и присваиваются, только если производный класс использует синтезируемые версии этих функций-членов. В синтезируемых функциях-членах управления копированием каждый базовый класс неявно создается, присваивается или удаляется с использованием соответствующего члена базового класса.
Например, если класс Pandaиспользует синтезируемые функции-члены, то инициализация объекта ling_lingвызовет конструктор копий класса Bear, который в свою очередь вызовет конструктор копий класса ZooAnimalпрежде, чем выполнить конструктор копий класса Bear:
Panda ying_yang("ying_yang");
Panda ling_ling = ying_yang; // использует конструктор копий
Как только часть Bearобъекта ling_lingсоздана, выполняется конструктор копий класса Endangered, создающий соответствующую часть объекта. И наконец, выполняется конструктор копий класса Panda. Аналогично для синтезируемого конструктора перемещения.
Интервал:
Закладка: