- •Ооп основано на понятии класса и объекта
- •Тип_возвр_знач имя_класса :: имя_метода (список, параметров) {реализация метода}
- •Параграф 2 Конструкторы и деструкторы (стр 272)
- •Параграф 3 - дружественные функции (файл op2) (стр 294)
- •Параграф 5 - перегрузка операций
- •Параграф 6 Статические компоненты класса (стр 506)
- •Параграф 8 - класс-контейнер (справочник 642)
- •Абстрактные классы и виртуальные функции
Параграф 5 - перегрузка операций
Для любого класса мы можем определить как будут выполняться те или иные операции. Позволяет определить операции для новых классов, каким образом они будут выполняться.
Перегрузка операторов реализуется с помощью специальных операторов функций.
Создание операторной функции:
Тип имя_класса::operator# (список_аргументов)
{ операции ; над ; классом ; }
вместо # знак оператора (+, -, /,-=, +=,<<,>>,%)
Операторная функция может быть как членом класса, так и не быть им, во втором случае
Обычно определяется как «друзья»
варианты реализации:
-метод класса (z1+=z2); - выносятся операции изменяющие значение - вызывается через объект класса, левый операнд должен быть объектом этого класса, тоесть 5+(3+i) не будет выполнено если не будет конструктора сделавшего из 5 комплексного числа.
При использовании += и т.д. изменяется сам объект.
-не метод класса (вне класса) (z1+z2 аналогично operator+(z1,z2)) - выносятся бинарные операции
перегрузка операций поместить в поток вывода << , и ввода >>
стандартные потоки вывода: cout cin можtм использовать только для стандартных типов данных, если мы её перегрузим, тогда мы сможем выводить например комплексные числа.
ostream & operator<<(double) // те << является классом ostream
Параграф 6 Статические компоненты класса (стр 506)
1) статические данные (переменные) класса
переменная, которая является частью класса, но не является частью объекта этого класса называется статистической.
Статистическая переменная описана в классе и существует в единственном экземпляре, внутри класса она глобальная, она может существовать даже когда не существует ни одного объекта класс. Доступ - по имени класса или через объект, что тоже возможно. Глобальная переменная с областью видимости только внутри класса - самое важное!!
static h:
class X
{
int a; public:
static int b; //обязательно надо приснициализировать!
};
cpp:
{
int x::b=1 //вот и инициализация
}
main ()
{
X obj,ob2; //каждый имеет независимую копию, но переменная b у них одна
cout << X::b<< endl;
x::b=-5; //пока в паблике можем менять
cout << obg.b<</t<<obj2.b<<endl; //выведет -5 -5
}
Статические функции-члены (статические методы) класса
static
могут использоваться через имя объекта, либо используя имя своего класса работает только со статическими методами либо другими статическими даннынми.
a теперь по нормальному
h:
class X
{
static int b;
public:
static int voi set_b (int);
static int voi get_b (int);
x();
}
int main ()
{
x::set_b(5);
cout <<x::get_b()<< endl; /выведется пять
obj1.bget_b();
obj2.get)b();
};
см класс date;
Параграф 8 - класс-контейнер (справочник 642)
классы-контейнеры - классы проектируемые для хранения коллекций (наборов) объектов определенных типов данных.
проектируем их в виде шаблонов
типы:
1)vector – динамический массив
2) list, linuted list - односвязные и двусвязные списки (справочник 646)
3) бинарные деревья (binary trees) - эфф сортировка,эфф поиск бинарный,
4) хэш таблицы - опимизированная для вставки и поиска элементов,
5) stack - стек
каждый контейнер должен предусматривать вставку, удаление, сортировку и поиск элементов. Каждый контейнер специализируется - преимущество в определенной задаче.
1) Векторы – динамические массивы, элементы хранятся последовательно в ячейках. Неэффективны вставка и удаление, эффективна сортировка
класс можно описать как вложенный класс - он будет объектом объемлющего класса.
vector - объемлющий
iterator - вложенный
class A
{
private: int x;
privat:double get_b();
class B{
}
...
}
методы класса А не имеют доступа в privat часть класса В
методы класса В не имеют доступа в privat часть класса А
в зависимости от того, где мы объявляем
в паблик - может создать и использовать объек класса В (чаще всего объявляем тут)
в приват - не можем
A::B obj - имя класса!
}
если требуется чтобы методу А требуется доступ в приват В то, class B{ friend class A...}
смотрим primer.cpp
2) односвязные списки - контейнер состоящий из набора узлов, где каждый узел содержит 2 элемента: элемент данных и ссылка на следующий (адрес следующего узла списка).
(эффективна вставка элемента и удаление, сортировка и поиск - неэффективны)
Списки:
а) Замкнутые (Циклические) – в конце ссылка на первый элемент
b) Незамкнутые – в конце NULL (нулевая ссылка)
Фиктивный узел – следующий за последним (он же пустышка)
преимущества структуры - гибкость по отношении к вставке, удалению элемента (сортировка - в векторе, а не тут) отличие списков от вектора- элементы списка могут быть разбросаны в памяти как угодно (это гуд!) для того чтобы найти итый элемент надо пройти весь путь от первого до нужного ( поиск циклом)
псевдокод:
stract Node { Item data(данные), Node* next (ссылка);}
Note new_node (data);
new_node->next=x->next; //вставка типа
x-> next = &new_node;
//удаление
x-> next= x->next->next;
node * tmp = x-> next;
delete tmp;
node* x;
//поиск в списке
for (node* x!= begin x!=NULL; x= x-> next;
if ( x-> data == key)
break;
BST – binary search tree (узлы имеют не более двух потомков)
http://algolist.manual.ru/ds/btree.php
BST – структурированная коллекция узлов, которые удовлетворяют правилу:
Значение в каждом узле левого поддерева должно быть меньше значения главного узла, и больше для правого узла.
А – корень,
В – левый потомок А
С – правый потомок А
В – корень левого поддерева А
Квадраты - листья
Размер – число внутренних узлов (в кружках)
Предок (родитель) узла p называется узел n, такой, что p – потомок узла n
Длина пути – число ребер между узлами.
Уровни: А – нулевой уровень,
B, C – первый уровень и т.д.
В зависимости от порядка на одинаковых наборах будут получаться разные деревья.
1) 5 7 2 3 8
2) 7 8 3 5 2
3) 2 3 5 7 8
Операции:
вставка
удаление (3 варианта)
удаление листа – удаляет узел, обнуляем указатель родителя.
если один потомок
если два потомка :
выбираем самый большой из левого поддерева (самый правый из левого поддерева) или самый маленький из правого поддерева (самый левый из правого)
заменяем значение в х
удаляем лист
поиск
Виды обходов дерева:
Обход двоичного дерева – это процесс, при котором каждый узел посещается только один раз.
1) симметричный обход - сначала в симметричный обход левого поддерева, затем посещения корня и потом в симметричный обход правого поддерева.
При симметричном обходе каждого из двоичных деревьев поиска, показанных на рис. 2, узлы посещаются в возрастающем порядке: 2, 3, 5, 7, 8.
2) прямой обход - Для корня дерева рекурсивно вызывается следующая процедура:
Посетить узел
Обойти левое поддерево
Обойти правое поддерево
3) Обратный обход
Обойти левое поддерево
Обойти правое поддерево
Посетить узел
Балансировка деревьев
AVL деревья
Деревья бывают сбалансированные и несбалансированные (они получаются из частично или полностью отсортированных списков)
У сбалансированного дерева каждый узел удовлетворяет условию: для любого узла разность длин левого и правого поддерева не больше 1.
AVL дерево: balance {-1,0,1} = высота правого поддерева - высота левого поддерева
Обычная вставка может разбалансировать дерево.
Способы балансировки дерева:
левое вращение
правое вращение
двойное левое вращение (простое правое + простое левое)
двойное правое вращение (простое левое + простое правое)
левое вращение правое вращение
двойное левое вращение (простое правое + простое левое)
двойное правое вращение (простое левое + простое правое)
параграф 9
стандартная библиотека шаблонов STL (Standard Template Library) (стр 522)
Библиотека STL – набор шаблонных классов и функций общего назначения.
Основную роль в разработке STL сыграли Степанов и Страуструп
Ядро библиотеки состоит из трех ключевых элементов:
1) шаблоны классов-контейнеров (контейнеры)
2) итераторы
3) обобщенные алгоритмы (алгоритмы)
Контейнеры (стр 522)– объекты содержащие другие объекты, существует несколько типов контейнеров, например:
Последовательные контейнеры(базовые в STL): vector – определяет динамический массив, queue – двустороннюю очередь, а класс list – обеспечивает работу с линейным списком
Ассоциативные контейнеры(деревья): класс map позволяющий хранить пару «ключ-значение», multimap – ключ – несколько значений //переводчик
Каждый контейнерный класс определяет набор функций, который можно применять к данному контейнеру.
Итераторы (стр 522) – объекты действующие подобно указателям, позволяют циклически опрашивать содержимое контейнера. Существует пять типов итераторов:
произвольного доступа – random acces – сохраняют и считывают значения, позволяют организовать произвольный доступ к элементам
двунаправленные – bidirectional - сохраняют и считывают значения, обеспечивают инкрементно – декрементное перемещение
однонаправленные – forward - сохраняют и считывают значения, обеспечивают только инкрементное перемещение
входные – input – считывают, но не записывают значения, обеспечивают инкрементное перемещение
выходные – output – записывают, но не считывают значения, обеспечивают инкрементное перемещение
Алгоритмы (стр 551) - обрабатывают данные, содержащиеся в контейнерах. Позволяют работать с двумя различными типами контейнеров одновременно (последовательные и ассоциативные). Требуется заголовок - <algorithm>