
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
Наследуются все функции-элементы, кроме указанных ниже.
1)Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы.
Порядок вызова конструкторов в иерархии следующий.
а)Если в конструкторе производного класса отсутствует явный вызов конструктора базового класса, автоматически вызывается конструктор базового класса с умолчанием, т.е. тот, который можно вызвать без параметров.
б)Если конструктор базового класса требует указания параметров (наш случай), он вызывается явным образом в конструкторе производного класса в списке инициализации.
в)В случае нескольких базовых классов (множественное наследование) их конструкторы вызываются в порядке объявления.
г)В иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются, начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов производного класса, которые являются объектами (см. композицию классов) других классов, в порядке их объявления в классе, а затем исполняется конструктор производного класса.
2)Не наследуется операция присваивания.
3)Не наследуются деструкторы.
а)Если в производном классе нет деструктора, он формируется по умолчанию и вызывает деструкторы всех базовых классов.
б)В отличие от конструкторов, в деструкторе производного класса не требуется явно вызывать деструкторы базовых классов, т.к. это делается автоматически.
в)Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в порядке, строго обратном вызовам конструкторов: сначала вызывается деструктор производного класса, а затем уже – деструктор базового класса.
Виртуальные функции и полиморфизм
(виртуальный – возможный, полиморфизм – способность к модификациям)
В рассмотренном выше примере наследования вызов функции –элемента происходил в соответствии с типом указателя, а не с фактическим типом объекта, на который ссылался указатель. Указателю базового класса был присвоен адрес объекта производного класса.
Объясняется это тем, что ссылки на функции-элементы разрешаются во время компиляции и компоновки программы. Это называется ранним связыванием. Для вызова функции-элемента производного класса потребовалось явное преобразование типа указателя.
На практике это не всегда возможно, поскольку во время выполнения программы указатель может ссылаться на объекты разных классов иерархии, а во время компиляции программы конкретный тип может быть неизвестен. Приведем примеры.
1)Параметром функции является указатель базового класса. На его место во время выполнения программы может быть передан указатель на объект любого производного класса.
2)Указатели на различные объекты иерархии входят в связный список. С указателями списка требуется выполнять единообразные операции.
В языке С++ есть механизм позднего связывания, когда разрешение на функции-элементы класса происходит на этапе выполнения программы, в зависимости от конкретного типа объекта, вызвавшего функцию. Этот механизм реализован с помощью виртуальных функций.
Пример обявления виртуальной функции:
virtual float getx() const;