- •Тема 1.Понятие технологии программирования (2 часа). 3
- •Тема 2. Основные концепции ооп (2 часа). 7
- •Тема 3. Конструкторы и деструкторы (2 часа). 12
- •Тема 5. Дружественные функции (friend functions) (2 часа) 32
- •Тема 6. Обработка исключительных ситуаций (2 часа) 44
- •Тема 8. Производные классы (2 часа) 76
- •Тема 9. Виртуальные функции (2 часа) 83
- •Тема 10. Множественное наследование. Производные классы векторов (2 часа) 90
- •Тема 12. Шаблоны функций и классов. 128
- •Тема 14. Применение оо-подхода в базах данных 148
- •Тема 1.Понятие технологии программирования (2 часа).
- •1.1. Предмет изучения курса ооп
- •1.2. Исторический экскурс
- •1.3. Основные технологии программирования
- •1.4. Заключение
- •Тема 2. Основные концепции ооп (2 часа).
- •2.1. Объекты и классы
- •2.1.1.Понятие класса объектов
- •2.1.2. Основные характеристики состояния класса
- •2.1.3. Понятие инкапсуляции свойств объекта
- •2.1.4. Структура глобальной памяти класса и глобальные методы класса
- •2.1.5. Интерфейс класса
- •2.1.6. Функции-члены класса
- •2.2. Понятие наследования (Inheritance)
- •2.3. Понятиеполиморфизма
- •Тема 3. Конструкторы и деструкторы (2 часа).
- •3.1. Для чего нужны конструкторы
- •3.2. Использование конструкторов «по умолчанию»
- •3.3. Использование деструкторов
- •3.4. Демонстрация последовательности работы конструкторов и деструкторов
- •3.5. Конструктор копирования
- •3.6. Определение операции присваивания
- •3.6.1. Пример использования конструктора копирования.
- •3.7.1. Краткий обзор библиотеки stl
- •3.7.2. Вектора
- •3.8. Inline-подстановка
- •4.1. Перегрузка операторов
- •4.1.1. Пример на перегрузку операторов
- •4.1.2. Общие принципы перегрузки операторов
- •4.1.3. Бинарные и Унарные Операции
- •4.2. Пример с перегрузкой операторов
- •Тема 5. Дружественные функции (friend functions) (2 часа)
- •5.1. Примеры использования дружественных функций
- •5.2. Особенности перегрузки префиксной и постфиксной форм унарных операций
- •5.3. Статические члены данных
- •5.4. Перегрузка операторов new, new[], delete, delete[]
- •Void* operator new(size_t размер){ код оператора
- •Void operator delete(void* p){ код оператора }
- •Void* operator new[](size_t размер){ код оператора return указатель_на_память; }
- •Void operator delete[](void* p){ код оператора }
- •Тема 6.Обработка исключительных ситуаций(2 часа)
- •6.1. Применение try, catch, throw
- •6.2. Синтаксис и семантика генерации и обработки исключений
- •6.3. Обработка исключений
- •6.4. Обработка исключений при динамическом выделении памяти
- •6.5. Функции, глобальные переменные и классы поддержки механизма исключений
- •6.6. Конструкторы и деструкторы в исключениях
- •7.1 Строковые типы
- •7.1.1. Преобразования, определяемые классом
- •7.1.2. Встроенный строковый тип
- •7.1.3 Класс string
- •7.2. Пример строкового класса с перегруженными операторами и дружественными функциями
- •Тема8.Производные классы (2 часа)
- •8.1. Определение производного класса
- •8.2. Правила использования атрбутов доступа
- •8.3. Конструкторы и деструкторы производных классов
- •Тема 9. Виртуальные функции (2часа)
- •9.1. Определение виртуальных методов
- •9.2. Абстрактные классы
- •9.3. Таблицы виртуальных методов (функций)
- •9.4. Выводы
- •Тема 10. Множественное наследование. Производные классы векторов (2 часа)
- •10.1. Множественное наследование
- •10.2. Отношения между классами
- •10.2.3. Ассоциация
- •10.2.4. Агрегирование
- •10.2.5. Наследование
- •10.3. Библиотека графических объектов (пример)
- •10.3.1. Динамический полиморфизм и наследование интерфейсов
- •10.3.2.Абстрактные классы
- •10.3.3. Множественное наследование в библиотеке графичкских фигур.
- •10.3.4. Иерархия классов библиотеки графичкских фигур
- •10.3.5. Таблица наследования
- •10.3.6. Диаграмма модулей
- •10.3.7.Директивы препроцессора
- •10.4. Производные классы векторов
- •10.5. Операции над векторами
- •11.1. Потоковый ввод-вывод
- •11.1.1. Классы потоков
- •11.1.2. Стандартные потоки
- •11.2.Опрос и установка состояния потока
- •11.3.Перегрузка операций извлечения и вставки в поток
- •11.4.Переадресация ввода-вывода
- •11.5. Операции помещения в поток и извлечения из потока
- •11.6.Форматирование потока
- •11.7.Файловый ввод-вывод с использованием потоков
- •11.8.Бесформатный ввод-вывод
- •11.9.Часто применяемые функции библиотеки ввода / вывода
- •11.10.Файлы с произвольным доступом
- •11.11. Буферизация
- •11.12. Заключение
- •Тема 12. Шаблоны функций и классов.
- •12.1 Шаблоны функций
- •12.2. Шаблоны классов
- •12.3. Размещение определений шаблонов в многомодульных программах
- •12.4. Полиморфные вектора
- •13.1 Область видимости
- •13.1.1. Локальная область видимости
- •13.2. Глобальные объекты и функции
- •13.2.1. Объявления и определения
- •13.2.2. Несколько слов о заголовочных файлах
- •13.3. Локальные объекты
- •13.3.1. Автоматические объекты
- •13.3.2. Регистровые автоматические объекты
- •13.3.3. Статические локальные объекты
- •13.4. Динамически размещаемые объекты
- •13.4.1. Динамическое создание и уничтожение единичных объектов
- •13.5. Определения пространства имен а
- •Тема 14. Применение оо-подхода в базах данных
- •14.1. Реляционные базы данных
- •14.2 Объектно-ориентированные базы данных (ообд)
- •14.3. Гибридные базы данных
- •Рекомендуемая литература
4.2. Пример с перегрузкой операторов
Определим класс «Таблица», который будет иметь два перегруженных оператора индексирования. Один из которых: char* Table::operator[](int i)возвращает запись по номеру, другой -int& Table::operator[](char* pattern)- наоборот – номер по записи.
C++ text
|
Комментарии
|
#include <stdio.h> |
Для внедрения вывода |
#include <string.h> |
Для манипуляции со сроками |
class Table |
|
{ |
|
int Value[100]; |
|
char Name[100][32]; |
100 имен, включающих 32 буквы каждое |
int Size; |
Размер таблицы |
public: |
|
Table() {Size=-1;};
|
Сначала таблица пустая:.Size=-1
|
void AddItem(char* name, int value); |
Функция используется для добавления срок к таблице |
void PrintOut(); |
Эта функция выдает таблицу на печать |
int& operator[](char*); |
Две перегрузки операции индексирования |
char* operator[](int); |
|
}; |
|
|
|
void Table::AddItem(char* name, int value) |
|
{
|
|
Size++; |
|
if (Size==100) { |
|
printf("\nTable overflow"); |
|
} else if (Size<100) { |
|
strcpy(Name[Size],name); |
|
Value[Size]=value; |
|
} |
|
} |
|
|
|
void Table::PrintOut() |
|
{ |
|
int i;
|
|
for (i=0; i<=Size; i++) { |
|
printf("\n%d %16s %d",i, Name[i], Value[i]); |
|
} |
|
} |
|
|
|
char* Table::operator[](int i) |
|
{ |
|
if (0<=i && i<=Size) { |
|
return Name[i]; |
|
}else{ |
|
printf("\nIndex %d is out of range",i); |
|
return NULL; |
|
} |
|
} |
|
int& Table::operator[](char* pattern) |
|
{
|
|
int i;
|
|
for (i=0; i<=Size; i++) { |
Этот цикл обеспечивает последовательный поиск |
if (strcmp(pattern,Name[i])==0) { |
в таблице и если шаблон найден, |
return Value[i]; |
возвращается соответствующее значение |
} |
|
} |
|
printf("\nIndex %s is out of range",pattern); |
|
return Value[0]; |
если шаблон не найден, функция возвращает первое значение |
} |
|
Чтобы проверить этот класс, давайте заполним таблицу данными о типе пива и его рейтинге
|
Name |
Value |
0 |
Николаевский пивзавод "Янтарь" |
4 |
1 |
Черниговский пивкомбинат "Десна" |
5 |
2 |
ОАО "Львовская пивоварня |
2 |
3 |
ЗАО "Сармат" |
6 |
4 |
Донецкий пивоваренный завод |
1 |
Переменный размер в этом примере имеет значение последнего индекса, то есть 4. В этом примере оператор индекса таблицы [2] вернет значение ОАО "Львовская пивоварня", оператор индекса таблицы [Николаевский пивзавод "Янтарь"] возвращает значение 4, оператор таблицы [5] приводит к ошибке "Index 5 вне диапазона" и, наконец, оператор таблицы ["Ace"] будет производить сообщение об ошибке "Индекс “Ace” вне диапазона".
Чтобы проверить этот класс может быть использована простая программа:
main() |
|
{ |
|
Table CR; |
“Table” – имя класса, “CR” имя объекта класса “Table” |
int i; |
|
|
|
CR.AddItem("Николаевский пивзавод Янтарь",4); |
Заполните таблицу CR значениями |
CR.AddItem("Черниговский пивкомбинат Десна" ,5);
|
|
CR.AddItem("ОАО Львовская пивоварня",2);
|
|
CR.AddItem("ЗАО "Сармат"",6);
|
|
CR.AddItem("Донецкий пивоваренный завод ",1);
|
|
CR.PrintOut();
|
распечатать содержимое таблицы CR на экран |
|
|
i=CR["Донецкий пивоваренный завод "]; printf("\n%d",i);
|
|
i=CR["Николаевский пивзавод Янтарь"]; printf("\n%d",i); |
|
i=CR["Ace"]; printf("\n%d",i); |
|
printf("\n %s",CR[1]); |
|
printf("\n %s",CR[3]); |
|
printf("\n %s",CR[4]); |
|
} |
|