
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
1) В функциях-элементах доступ к объектам-компонентам осуществляется через указатели на эти объекты, объявленные в заголовочном файле модуля.
Label1->Caption=..//доступ к свойству Caption через указатель Label1
Можно (*Label1).Caption, но принято без разыменования, как выше.
Label1->Hide(); //доступ к методу Hide() через указатель Label1
Label1->Visible=false; //делает метку невидимой
2) Пусть имеются две функции с именем fun, одна – в классе (функция-элемент), а другая – вне класса. Тогда из третьей функции, не принадлежащей классу, ссылка на первую Form1::fun(), т.е. с именем класса, а на другую – непосредственно по имени fun.
3) Обращение к переменным и функциям, описанным внутри и вне класса, из функций-элементов – одинаковое, просто по имени.
4) Обращение из функций, описанных вне класса, к переменным и функциям вне класса – просто по имени, а к переменным и функциям в классе – через имя объекта класса. Внешние по отношению к классу функции получают доступ ко всему, объявленному в классе, через ссылку на объект Form1.
5) Переменные, объявленные вне класса, остаются в одном экземпляре. А переменные класса при создании нескольких объектов одного класса тиражируются по числу объектов. В каждом объекте будет своя переменная и все они будут никак не связаны друг с другом.
Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем несколько форм (Form1 – Unit1 (.h, .cpp), Form2 – Unit2 (.h, .cpp))
1) Переменные, объявленные в заголовочном файле модуля, или в файле его реализации вне определения функций и вне объявления класса, являются глобальными. Они доступны везде внутри данного модуля. Для доступа к ним из внешних модулей в них должно быть повторено их объявление (без инициализации) с extern.
Например, в Unit1 объявлена глобальная переменная int a1=10; В модуле Unit2 можно использовать эту переменную, если там объявить extern int a1, вне зависимости от того, включен или нет директивой #include файл Unit1.h в модуль Unit2.
2) Если в Unit2 не дано объявление a1, а файл Unit1.h включен в Unit2 директивой #include “Unit1.h”, то в Unit2 будет создана копия a1, инициализированная согласно объявлению в Unit1.h. Эта копия будет полностью изолирована от a1 в Unit1. В модулях Unit1 и Unit2 будут существовать две различные переменные с именем a1.
3) Локальные переменные, объявленные внутри функций, невозможно видеть в другом модуле.
4) Функции, объявленные в заголовочном файле модуля вне объявления класса, являются глобальными. Они доступны везде внутри данного модуля. Для доступа к ним из внешних модулей там надо повторить их объявления, или директивой #include включить заголовочные файлы тех модулей, в которых функции объявлены.
5) Функции, объявленные и определенные в файле реализации модуля, являются глобальными. Они доступны везде внутри данного модуля. Для доступа к ним из внешних модулей там надо повторить их объявление.
6) Элементы (переменные и функции), объявленные в private:, видимы и доступны только внутри данного модуля. При этом из функций-элементов класса – доступ по имени, а из других функций модуля – только со ссылкой на объект данного класса. Если в модуле описано несколько классов, то объекты этих классов взаимно видят элементы, описанные в их разделах private:.
7) Элементы (переменные и функции), объявленные в public:, видимы и доступны для объектов любых классов и для других модулей, в которых директивой #include включен заголовочный файл данного модуля. При этом из объектов того же класса к ним можно обращаться по имени, а из других объектов и функций – только со ссылкой на объект данного класса.
8) Элементы, объявленные в protected:, видимы и доступны для любых объектов внутри данного модуля, а также для объектов классов-наследников данного класса в других модулях. Объекты из других модулей, классы которых не являются наследниками данного класса, защищенных элементов не видят.
9) Если нужно запретить обращение к функции из другого модуля, её нужно объявить со спецификацией static:
static void F();