Несмотря на то что вложенный класс определяется в пределах содержащего его класса, важно понимать, что никакой связи между объектами содержащего класса и объектами его вложенного класса (классов) нет. Объект вложенного типа только содержит члены, определенные во вложенном типе. Точно так же у объекта содержащего класса есть только те члены, которые определяются содержащим классом. Он не содержит переменные-члены любых вложенных классов.
Конкретней, второй оператор >return
в функции-члене >TextQuery::query()
использует переменные-члены объекта класса >TextQuery
, для которого была выполнена функция >query()
, инициализирующая объект класса >QueryResult
:
>return QueryResult(sought, loc->second, file);
Эти члены используются для создания возвращаемого объекта класса >QueryResult
, поскольку он не содержит члены содержащего его класса.
Упражнение 19.20. Вложите собственный класс >QueryResult
в класс >TextQuery
и повторно запустите написанную в разделе 12.3.2 программу, использующую класс >TextQuery
.
19.6. Класс объединения, экономящий место
Класс объединения (union) — это специальный вид класса. У него может быть несколько переменных-членов, но в любой момент времени значение может быть только у одного из членов. Когда присваивается значение одному из членов класса объединения, все остальные члены становятся неопределенными. Объем хранилища, резервируемого для объединения, достаточен для содержания наибольшей переменной-члена. Подобно любому классу, класс объединения определяет новый тип.
Некоторые, но не все средства класса объединения применяются одинаково. У класса объединения не может быть члена, являющегося ссылкой, но у него могут быть члены большинства других типов, включая, согласно новому стандарту, типы классов с конструкторами или деструкторами. Объединение может использовать спецификаторы доступа, чтобы сделать члены открытыми закрытыми, или защищенными. По умолчанию, как и у структуры, члены объединения являются открытыми.
Класс объединения может определять функции-члены, включая конструкторы и деструкторы. Но объединения не могут происходить от другого класса и не могут быть использованы как базовый класс. В результате у объединения не может быть виртуальных функций.
Объединения позволяют создать набор взаимоисключающих значений, которые могут иметь разные типы. Предположим, например, что существует процесс, в ходе которого обрабатываются различные виды числовых или символьных данных. Для хранения этих значений можно было бы использовать следующее объединение.
>// объект типа Token способен содержать один член, имеющий любой из
>// следующих типов
>union Token {
> // члены по умолчанию открыты
> char cval;
> int ival;
> double dval;
>};
Определение объединения начинается с ключевого слова >union
, за которым следует имя объединения (не обязательно) и набор его членов, заключенный в фигурные скобки. Этот код определяет объединение по имени >Token
, способное содержать значение типа >char
, >int
или