- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Дружественный класс
- •Использование указателя this
- •Композиция классов
- •Дружественные функции класса
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Перегрузка бинарных операций
1) Функция-операция – как функция-элемент класса:
class time {
--------------
bool operator>(const time& t)
{ if(h>t.geth()) return true;
return false;
}
--------------
};
Примечание. Вызывающий функцию-операцию объект является первым операндом.
void main()
{ time t1,t2;
------------
if(t1>t2) -----
-------------
}
2) Функция-операция – просто функция. Должна иметь два параметра типа класса.
bool operator>(const time& t1, const time& t2)
{ if(t1.geth()>t2.geth()) return true;
return false;
}
Перегрузка операции присваивания
Определена по умолчанию в любом классе как побитовое копирование. Вызывается каждый раз, когда одному существующему объекту присваивается значение другого существующего объекта. Если класс содержит элементы, память под которые выделяется динамически, то присваивание по умолчанию будет неправильным, и оказывается необходимым определить собственную операцию присваивания.
Функция-операция присваивания может быть определена только как функция-элемент класса, так как она имеет единственный параметр – ссылку на присваиваемый объект этого класса и возвращает ссылку на объект, для которого она была вызвана и который является первым операндом операции присваивания.
//----------------------------------------------------------------------------------------------
class employee {
public:
employee (const char*); //
---------------------------
const employee& operator=(const employee& e);
---------------------------
private:
char* f;
------------
};
//-----------------------------------------------------------------
// Определение операции присваивания
const employee& employee:: operator=(const employee& e)
{
if(&e==this) return *this; //проверка на самоприсваивание
if(f) delete[]f;
if(e.f) { f=new char{strlen(e.f)+1];
strcpy(f, e.f); }
else f=0;
return *this;
}
//----------------------------------------------------------------------------------------------
Возврат из функции ссылки на объект делает возможной цепочку операций присваивания:
employee a(“Иванов”), b, c;
----------------------------
c=b=a;
Перегрузка операции приведения типа
Используется для преобразования объекта класса к другому типу.
Формат: operator имя_нового_типа();
Тип возвращаемого значения и параметры можно не указывать.
time::operator int() {return h;}
-------------------------
time t; cout<<int(t); //можно не использовать geth()
Перегрузка операции индексирования []
Операция [] перегружается тогда, когда тип класса представляет множество значений, для которого индексирование имеет смысл. Операция индексирования должна возвращать ссылку на объект, содержащийся во множестве.
//----------------------------------------------------------------------------------------------
#include <iostream.h>
#include <stdlib.h>
class vector {
public:
vector(const int a[], int n); //конструктор, инициализация массивом
~vector() { delete[]p;} //деструктор
int& operator[](int i); //перегруженная операция индексирования
void print() const;
----------------------
private:
int* p;
int size;
};
//-------------------------------------------------------------------
int& vector::operator[](int i)
{ if(i<0||i>=size) {
cout<<”Неверный индекс (i=”<<i<<”) “<<endl;
cout<<”Завершение программы”<<endl;
exit();
}
return p[i];
}
//--------------------------------------------------------------------
void main()
{ int mas[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector a(mas,10);
a.print(); //1 2 3 …..
cout<<a[5]<<endl; //6
cout<<a[10]<<endl; // Неверный индекс (i=10)
// Завершение программы
}
//----------------------------------------------------------------------------------------------
Перегруженная операция индексирования получает целый аргумент и проверяет, лежит ли его значении в пределах диапазона массива. Если “да”, то возвращается элемент, что соответствует смыслу стандартной операции индексирования.
