- •1. Внутренняя сортировка (сортировка массивов).
- •6. Рекурсия. Рекурсивные функции
- •2.2 Обьявление класса
- •2.3 Определение функций-членов класса
- •2.4 Использование класса
- •2.5 Управление доступом к классу
- •1 Частные члены класса
- •10. Понятие дерева. Классификация деревьев. Способы представления дерева.
- •2. Удаление элемента.
- •3. Последовательный поиск в списке.
- •2 Защищенные члены класса
- •1. Вставка элемента.
- •3 Общедоступные члены класса
- •2.6 Указатель this
- •11. Общие операции над деревьями. Процедуры добавления и удаления элемента. Количество листьев и узлов в дереве.
1. Вставка элемента.
PNode2 p;
p = new Node2; //p – переменная типа PNode2
p -> next = q -> next;
p -> prev = q;
q -> next -> prev = p; //новый порядок у q^.next
q -> next = p;
q = p;
Опишем функцию вставки элемента в двусвязный список после заданного q.
void Ins_q2(PNode2 &q, int a )
{PNode2 p;
p = new Node2;
p -> inf = a;
p -> next = q -> next;
p -> prev = q;
q -> next -> prev = p //новый порядок у q^.next
q -> next =p;
q = p; //q – заданный элемент}
2. Удаление элемента.
p = q -> prev;
p -> next = q -> next;
q -> next -> prev = p;
delete q;
q = p; //предшествующий элемент станет текущим
Опишем функцию удаления текущего элемента двусвязного списка:
Void Del_q2(PNode2 &q, int a )
{PNode2 p;
p = q -> prev;
a = q -> inf;
p -> next = q ->next;
q -> next -> prev = p;
delete q;
q = p; //предшествующий элемент станет текущим}}
int Del_q2(Pnode2 &q) //функция вернет символ
{int a;
PNode2 p;
p = q -> prev;
a = q -> inf;
p -> next = q -> next;
q -> next -> prev = p;
delete q;
q = p; //предшествующий элемент станет текущим
return a;}
3. Последовательный поиск в списке.
PNode2 q;
bool fsearch;
q = first;
do
{fsearch = q -> inf > p ->inf; //проверка порядка информационного поля
if (!fsearch) //поиск не увенчался успехом
if (q -> next != NULL) //не последний элемент
q = q -> next;
else fsearch = true;//последний элемент, выход из цикла
else q = q -> prev;//поиск успешен, новое состояние q
} while (!fsearch);
Опишем функцию поиска места для вставляемого элемента двусвязного списка:
void Search_in_list2( PNode2 &q, PNode2 first, int a )
{bool fsearch;
q = first;
do
{fsearch = q -> inf > p ->inf;//проверка порядка информационного поля
if (!fsearch) //поиск не увенчался успехом
if (q -> next != NULL) //не последний элемент
q = q -> next;
else fsearch = true;//последний элемент, выход из цикла
else q = q -> prev;//поиск успешен, новое состояние q
return value; //доступ разрешен}
void main(void) {
TPrivateClass cl; //создание объекта
} while (!fsearch);
Ins_q2(q, a);//вставка нового элемента после q
int i = cl.value; //ошибка! Нет доступа
i = cl.GetValue();//ошибка! Нет доступа}
2 Защищенные члены класса
Ч
лены
и функции объявленные в защищенном
(protected) разделе класса доступны только
для функций производных классов. Обычно
в этом возникает необходимость тогда,
когда разрабатываемый класс является
базовым классом для других классов. В
этом случае он ограничивает доступ к
данным внешним пользователям и разрешает
доступ для классов наследников. Рассмотрим
пример иерархии объектов.
class A { protected: int val; };
class B: public A {//наследуется от A public: void fb();};
void B::fb() { val = 0; } //доступ разрешен
class C:public B { //наследуется от B public: void fc();};
void C::fc() {val = 10;} //доступ разрешен
В данном примере приведена иерархия классов A->B->C. Свойство защищенности распространяется вниз по иерархии до тех пор пока производный класс объявляет свой базовый общедоступным (public). При этом любые функции-члены в классах C и B имеют доступ к члену данных val базового класса. Если функция-член производного класса в качестве входного параметра имеет указатель или ссылку на объект базового класса, то правила становятся другими. Модифицируем класс C следующим образом.
class C:public B { public:
void fc(A&); //Входной параметр ссылка на базовый класс};
void C::fc(A& a) {
val = 10; //доступ разрешен
a.val = 10; //ошибка! нарушение прав доступа }
