Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_С++_последная.doc
Скачиваний:
44
Добавлен:
07.05.2019
Размер:
876.54 Кб
Скачать

7.4.3. Вложенные классы

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

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

Доступа по умолчанию к приватным компонентам объемлющего класса вложенный класс не имеет, как и объемлющий класс – к приватным компонентам вложенного. Обойти запрет помогает механизм дружественных отношений, например:

class External

{ //…

friend class Inner; // Inner доступна приватная

// часть External

class Inner // вложенный класс

{ friend class External; // External доступна приватная

// часть Inner

//…

};

};

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

void External :: Inner :: MethodInner(const External &t)

{ //...

memlnner = t.MethodExterna();// вызов метода объемлющего класса

//…

};

Метод вложенного класса Methodlnner() получает ссылку на объект внешнего класса и обычным способом вызывает метод MethodExternal ().

Если вложенный класс объявлен как public, то его можно использовать в качестве типа по всей программе. Его имя следует писать с префиксом – именем объемлющего класса:

External :: Inner *pointer;

Если вложенный класс объявлен в закрытой части объемлющего класса, то он доступен только членам объемлющего класса и его друзьям. В этом случае компоненты вложенного класса обычно делают открытыми – тогда нет нужды и объявлять другом объемлющий класс, например:

class External

{ //...

friend class Inner; // Inner доступна приватная

// часть External

structure Inner { /* все элементы доступны в External */ };

//…

};

Внутри методов вложенного класса ключевое слово this является указателем на текущий объект вложенного класса.

Методы вложенного класса можно реализовать непосредственно внутри класса. Если же методы вложенного класса определяются вне класса, определение необходимо ставить вне самого внешнего из объемлющих классов – в области глобальной видимости. Имя метода в таком случае должно иметь префиксы; количество префиксов равно уровню вложенности классов.

В области глобальной видимости вне объемлющего класса можно определить и сам вложенный класс. C++ разрешает это делать, если в объемлющем классе задать объявление класса, например

class A

{ //...

class В; // объявление вложенного класса

//...

//…

};

class A::B // внешнее определение вложенного класса

{ //...

};

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

Контрольные вопросы

1. Какова роль стандартных библиотек?

2. Какие основные стандартные библиотеки С вы знаете?

3. Какие вы знаете концепции в программировании?

4. Объекты и классы ООП.

5. Достоинства и недостатки ООП.

Лекция 8.