×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 686 из 714 Настройки
.

Вложенные и содержащие классы независимы

Несмотря на то что вложенный класс определяется в пределах содержащего его класса, важно понимать, что никакой связи между объектами содержащего класса и объектами его вложенного класса (классов) нет. Объект вложенного типа только содержит члены, определенные во вложенном типе. Точно так же у объекта содержащего класса есть только те члены, которые определяются содержащим классом. Он не содержит переменные-члены любых вложенных классов.

Конкретней, второй оператор >return в функции-члене >TextQuery::query() использует переменные-члены объекта класса >TextQuery, для которого была выполнена функция >query(), инициализирующая объект класса >QueryResult:

>return QueryResult(sought, loc->second, file);

Эти члены используются для создания возвращаемого объекта класса >QueryResult, поскольку он не содержит члены содержащего его класса.

Упражнения раздела 19.5

Упражнение 19.20. Вложите собственный класс >QueryResult в класс >TextQuery и повторно запустите написанную в разделе 12.3.2 программу, использующую класс >TextQuery.

19.6. Класс объединения, экономящий место

Класс объединения (union) — это специальный вид класса. У него может быть несколько переменных-членов, но в любой момент времени значение может быть только у одного из членов. Когда присваивается значение одному из членов класса объединения, все остальные члены становятся неопределенными. Объем хранилища, резервируемого для объединения, достаточен для содержания наибольшей переменной-члена. Подобно любому классу, класс объединения определяет новый тип.

Некоторые, но не все средства класса объединения применяются одинаково. У класса объединения не может быть члена, являющегося ссылкой, но у него могут быть члены большинства других типов, включая, согласно новому стандарту, типы классов с конструкторами или деструкторами. Объединение может использовать спецификаторы доступа, чтобы сделать члены открытыми закрытыми, или защищенными. По умолчанию, как и у структуры, члены объединения являются открытыми.

Класс объединения может определять функции-члены, включая конструкторы и деструкторы. Но объединения не могут происходить от другого класса и не могут быть использованы как базовый класс. В результате у объединения не может быть виртуальных функций.

Определение объединения

Объединения позволяют создать набор взаимоисключающих значений, которые могут иметь разные типы. Предположим, например, что существует процесс, в ходе которого обрабатываются различные виды числовых или символьных данных. Для хранения этих значений можно было бы использовать следующее объединение.

>// объект типа Token способен содержать один член, имеющий любой из

>// следующих типов

>union Token {

> // члены по умолчанию открыты

> char cval;

> int ival;

> double dval;

>};

Определение объединения начинается с ключевого слова >union, за которым следует имя объединения (не обязательно) и набор его членов, заключенный в фигурные скобки. Этот код определяет объединение по имени >Token, способное содержать значение типа >char, >int или