- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Статические элементы класса
Обычно каждый объект класса имеет свою собственную копию всех данных-элементов класса. Но иногда во всех объектах класса должна быть только одна копия некоторых данных-элементов, например, количество действующих объектов класса. Для этого используются статические данные-элементы, которые содержат информацию «для всего класса». В другом случае, когда достаточно одной единственной копии данных, статические данные-элементы экономят память.
Статические данные-элементы имеют область действия класс. Они могут быть открытыми, защищенными, закрытыми. Им можно задать начальные значения один (и только один) раз в области действия файл.
Статические элементы класса существуют даже тогда, когда не существует никаких объектов этого класса. В этом случае доступ к открытому статическому элементу – через <имя класса::> перед его именем, к защищенному или закрытому – с помощью специальной открытой статической функции-элемента. Она вызывается через <имя класса::> перед её именем.
Статические функции-элементы имеют доступ только к статическим данным-элементам класса.
При наличии объектов доступ к открытому статическому элементу – через имя объекта (указателя, ссылки), к закрытым и защищенным статическим данным-элементам – через функции-элементы этого класса и друзей класса.
Пример: использование закрытого статического элемента данных и открытой статической функции-элемента.
//----------------------------------------------------------------------------------------------
#include <iostream.h>
#include <string.h>
#include <assert.h>
class employee {
public:
employee(const char*);
~ employee();
const char* getf() const; //возвращает фамилию
static int getcount(); //статическая функция-элемент, возвра-
// щает число действующих объектов
private:
char* f;
static int count; //статический элемент данных (число
//действующих объектов)
};
//----------------------------------------------------------------------------------------------
//Задание начального значения статическому элементу данных в области
//действия файл
int employee::count=0;
//----------------------------------------------------------------------------------------------
int employee::getcount() {return count;}
//----------------------------------------------------------------------------------------------
//Конструктор
employee:: employee(const char* fm)
{ f=new char[strlen(fm)+1];
assert(f!=0);
strcpy(f,fm);
++count; //увеличение статического счетчика служащих
cout<<”Конструктор для “<<f<<”вызван”<<endl;
}
//----------------------------------------------------------------------------------------------
//Деструктор
employee::~ employee()
{ cout<<”Деструктор для “<<f<<”вызван”<<endl;
delete[]f;
--count; //уменьшение статического счетчика служащих
}
//----------------------------------------------------------------------------------------------
// const перед char* предотвращает изменение клиентом класса
// закрытых данных
const char* employee::getf() const
{ return f; }
//----------------------------------------------------------------------------------------------
void main()
{ cout<<”Количество служащих перед созданием объектов: ”
<< employee::getcount()<<endl; //0
employee* e1=new employee(“Иванов”); //Конструктор для Иванов
//вызван
employee* e2=new employee(“Петров”); //Конструктор для Петров
//вызван
cout<<”Количество служащих после создания объектов: ”
<<e1->getcount()<<endl; //2
cout<<”Служащий 1: ”<<e1->getf()<<endl; // Иванов
cout<<”Служащий 2: ”<<e2->getf()<<endl; // Петров
delete e1; //Деструктор для Иванов вызван
delete e2 //Деструктор для Петров вызван
cout<<”Количество служащих после удаления объектов: ”
<< employee::getcount()<<endl; //0
}
//----------------------------------------------------------------------------------------------
Элемент данных count служит для подсчета количества создаваемых и разрушаемых объектов.
Если объекты существуют, count может быть вызван любой функцией-элементом (в том числе как конструктором, так и деструктором). Если объектов нет, - то посредством вызова статической функции-элемента: employee::getcount(). Если есть, то: e1->getcount(). Функция-элемент getcount() определяет число объектов.
Примечание. В отличие от нестатических функций-элементов, статическая функция-элемент не имеет указателя this, потому что статические элементы существуют независимо от каких-либо объектов класса.
