- •Предисловие
- •Введение
- •Введение в программирование
- •1.1. Предисловие к курсу
- •1.2. Идеология языка
- •1.3. Обзор среды Microsoft Developer Studio
- •1.4. Жизненный цикл программного обеспечения
- •1.5. Общая структура программы
- •1.6. Директивы препроцессора
- •1.7. Построение исполняемого файла
- •1.8. Строительные блоки программы
- •Контрольные вопросы
- •Типы данных. Переменные. Массивы. Операции и Указатели
- •Стандартные типы и размеры данных
- •2.1.1. Объявление переменных
- •Управляющие символьные константы
- •2.2. Объявление указателя
- •2.2.1. Операции разыменования и взятия адреса
- •2.2.2. Указатели на указатели
- •2.2.3. Арифметические операции с указателями
- •2.3. Массивы
- •2.3.1. Инициализация массивов
- •2.3.2 Динамические массивы
- •2.3.3. Методы доступа к элементам массивов
- •2.3.4. Массивы указателей
- •2.4. Строки
- •2.5. Операции
- •2.5.1. Арифметические операции
- •Арифметические операции
- •2.5.2 Операции сравнения и логические операции
- •Операции сравнения и логические операции
- •2.5.3. Побитовые операции
- •Побитовые операции
- •Контрольные вопросы
- •3.1. Базовые операторы
- •3.1.1. Оператор выражение
- •3.2.2. Оператор switch
- •3.3.4. Оператор goto
- •3.4. Операторы цикла
- •3.4.1. Оператор for
- •3.4.2. Оператор while
- •3.4.3. Оператор do..While
- •Контрольные вопросы
- •Стандартный ввод/вывод. Работа с файлами.
- •4.1. Роль стандартного ввода/вывода
- •4.1.1. Основные функции стандартного ввода/вывода
- •4.2. Понятие файла
- •4.2.1. Строение файлов
- •4.2.2. Порядок работы с файлом
- •4.2.3. Обзор библиотечных функций с для работы с файлами
- •4.3. Программные конструкции при работе с файлами
- •4.3.1. Открытие/закрытие файла
- •4.3.2. Цикл посимвольного чтения содержимого файла
- •4.3.3. Цикл построчного чтения содержимого файла
- •Контрольные вопросы
- •Функция. Пользовательские типы данных.
- •5.1. Понятие функции
- •5.1.1. Определение функции
- •5.1.2. Формальные параметры
- •5.1.3. Тип возвращаемого значения
- •5.1.4. Тело функции
- •5.1.5. Фактические параметры
- •5.1.6. Рекурсивные вызовы
- •5.1.7. Передача параметров
- •5.1.8. Библиотеки стандартных функций
- •5.2. Пользовательские типы данных.
- •5.2.1. Ключевое слово typedef
- •5.2.2. Перечислимый тип данных
- •5.2.3. Понятие структуры
- •5.2.4. Указатели на структурный объект
- •Контрольные вопросы
- •Работа с динамической памятью. Динамические структуры данных
- •6.1. Работа с динамической памятью
- •6.1.1. Статическое и динамическое распределение памяти
- •6.1.2. Основные принципы динамического распределения
- •6.1.3. Способы работы с динамической памятью
- •6.2. Динамические структуры данных
- •6.2.1. Стек
- •6.2.2.Линейный список
- •Контрольные вопросы
- •Объектно-ориентированное программирование
- •7.1. Критерии качества декомпозиции проекта
- •7.2. Новые концепции программирования
- •7.3. Достоинства ооп
- •7.4. Объекты и классы в ооп
- •7.4.1. Определение класса
- •7.4.2. Использование класса
- •7.4.3. Вложенные классы
- •Контрольные вопросы
- •Конструкторы и Перегрузка операций.
- •8.1. Перегрузка операций
- •8.1.1. Перегрузка операций внешними функциями
- •8.1.2. Перегрузка операций методами класса
- •8.2. Конструкторы и деструктор
- •8.2.1. Конструкторы и параметры
- •Контрольные вопросы
- •9.1. Простое открытое наследование
- •9.1.1 Конструкторы и деструкторы при наследовании
- •9.1.2. Поля и методы при наследовании
- •9.1.3. Вложенные классы и наследование
- •9.1.4. Закрытое наследование
- •9.1.5. Виртуальные функции
- •9.1.6. Чистые виртуальные функции и абстрактные классы
- •9.3. Основы программирования под Windows
- •9.3.1. Типы данных в Windows
- •9.4. Cреда Microsoft Developer Studio
- •9.4.1. Библиотека mfc
- •9.4.2. Архитектура приложения
- •9.4.3. Каркас приложения
- •9.4.4. Проект приложения
- •Контрольные вопросы
- •Заключение
- •Список Литературы
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.