- •Тема 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. Гибридные базы данных
- •Рекомендуемая литература
5.1. Примеры использования дружественных функций
Проверим, как же работают дружественные функции, объявленные внутри класса.
#include <iostream.h>
class A //интерфейс (протокол) класса A
{
private:
int pole;
public:
A(){ //конструктор по умолчанию
pole=55;//инициализация закрытой переменной
//выведем на экран сообщение, что конструктор отработал
cout<<"Constructor A\n";
}
//объявление дружественной функции которая принимает экземпляр класса A
friend void ourfriend(const A &f);
};
//раз объявили дружественную функцию, то давайте уже и реализуем ее
void ourfriend(const A &f)
{
//итак, для демонстрации работы дружественной функции, мы обратимся
//к закрытой переменной pole экземпляра класса f и выведем ее значение на экран.
cout<<"\nWow! We have free access to private members,\n";
cout<<"pole ="<<f.pole<<endl;
}
void main()
{
A example; //создали экземпляр класса А - example
ourfriend(example); //собственно тестирование дружественной функции
}
Результат выполнения программы:
Constructor A
Wow! We have free access to private members,
pole =55
Итак, мы смогли получить доступ к закрытой переменной класса из функции (которая, при этом, не является членом класса), используя механизм дружественных функций. Заметим, что при работе с дружественной функцией следует помнить о том, что она не имеет указателя thisкласса, в котором она объявлена как дружественная. Почему?.. Ответ мы найдем в самом смысле использования дружественных функций: дружественная функция не является членом этого класса.
Если все функции-члены одного класса являются дружественными функциями другого класса, то это можно записать как:
friend class имя_класса;
Может ли функция быть дружественной нескольким классам? Да, но тогда надо добавить ее описание во все классы, к внутренним данным которых будет производиться обращение. А как же быть с защищенностью данных, если можно получить доступ к данным напрямую?Не волнуйтесь, с точки зрения использования механизма инкапсуляции (напомним, под этим понятием мы подразумеваем сокрытие данных),защищенность данных сохраняется, поскольку в дружественных функциях мы свободно работаем только с экземплярами данного класса, но не с самим классом.
Снова, рассмотрим пример, но на этот раз, в роли дружественных функций у нас будут выступать функции-члены.
#include <iostream.h>
class A //интерфейс (протокол) класса A
{
public:
A(){ //конструктор по умолчанию
cout<<"Constructor A\n";//конструктор отработал
}
//функция-член FriendToB() будет использоваться как
//дружественная функция для класса B
void FriendToB();
void SomeFunction();
};
class B //интерфейс (протокол) класса B
{
private:
int i,j; //наши "подопытные" закрытые переменные;
//если сможем обратиться к этим переменным
//из дружественной функии FriendToB(), то "опыт удался"
public:
B(){
i=10; //произведем инициализацию
j=17;
cout<<"Constructor B\n";//конструктор отработал
}
//укажем, что класс B имеет дружественную функцию, которая
//является функцией-членом класса A
friend void A::FriendToB();
};
class C
{
private:
int k,n;
public:
C(){
k=4; //начальная инициализация
n=7;
cout<<"\n\nConstructor C\n";//конструктор отработал
}
C(int kl,int nl){k=kl; n=nl;}
C operator+(C c1) // перегрузка оператора +
{
C temp(k+c1.k, n+c1.n);
return temp;
}
//укажем что ВСЕ функции-члены класса A, являются
//дружественными для даного класса
friend class A;
};
//действительно ли может функция-член одного
//класса обращаться к закрытым данным другого класса. Давайте проверим!
void A::FriendToB()
{
B example; //объявим экземпляр класса B
cout<<"So, variables' value are:\n";
//и произведем доступ к закрытым данным
cout<<"example.i="<<example.i;
cout<<"\nexample.j="<<example.j<<endl;
}
//действительно ли после объявления в классе С friend class A; -все функции-члены //класса A станут дружественными функциями для класса С?
//Ведь мы нигде не указывали, что функция-член SomeFunction() является //дружественной классу С. Надо проверить...
void A::SomeFunction()
{
C temp; //объявим экземпляр класса С
C temp1(10,10);
temp=temp+temp1; // доступ к функции класса С
cout<<"And now we are testing friend class...\n";
//и произведем доступ к закрытым данным
cout<<"temp.k="<<temp.k;
cout<<"\ntemp.n="<<temp.n<<endl;
}
void main()
{
A test; //создали экземпляр класса А - example
//собственно тестирование дружественной функции классу B
test.FriendToB();
//проверим, все ли функции-члены класса A являются дружественными
//классу С (на примере, функции SomeFunction)
test.SomeFunction();
}
Вот что будет выведено на экран, в результате выполнения программы:
Constructor A
Constructor B
So, variables' value are:
example.i=10
example.j=17
Constructor C
And now we are testing friend class...
temp.k=4
temp.n=7
Итак, если функция или функция-член объявлены как дружественные, то такие функции или функции-члены такого класса могут осуществлять непосредственный доступ ко всем (private, protected, public)данным (полям-данным и функциям-членам) класса, для которого они дружественны.