Стенли Липпман - Язык программирования 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
. Аналогично для синтезируемого конструктора перемещения.
Интервал:
Закладка: