- •2.Парадигми імперативного стилю.Парадигми процедур-ності.
- •3.Парадигма модульності.
- •4.Парадигма атд
- •5.Парадигма ооп.
- •7.Констуктори та деструктори.
- •8.Наслідування класів.
- •9.Обмеження доступу до базового кл.
- •10. Конструктор базового класу. Ініціалізація полів кл
- •11.”Покажчик на себе”. Статичні поля класу.
- •12.Конкретні і абстрактні типи. Віртуальні ф-ії.
- •13.Віртуальні конструктори та диструктори.Клонування.
- •14. Ефективний доступ до членів класу .Дружні ф-ії та дружні класи .
- •15.Множинне наслідування.
- •16.Віртуальні базові класи.
- •17.Перевантаження функцій.
- •18.Перевантаження унарних операцій.
- •22.Перетворення за допомогою конструкторів.
- •28.Елементи узагальненого програмування. Протеріччя з ооп. Поняття про ітератори та узагальнені алгоритми. Побудова узагальненої функції.
- •П алгоритми
- •30.Елементи узагальненого програмування. Контейнерно-ітераторна модель на основі шаблонних класів та шаблонних функцій.
- •Типи знань та методи їх представлення.
- •Парадигми імперативного стилю.Парадигми процедур-ності.
13.Віртуальні конструктори та диструктори.Клонування.
П-д:
class array_stack
{char *V;
array_stack (int size);
{ V=new char [size];}
~array_stack ( )
{ delete V;}};
Приклад віртуального деструктора:
Class emploee{…}
Class manager:public emploee {..} //уфігурни дужках може бути наприклад int level;i nt*Listofsub.
Void f()
{emploee *p=new manager;
delete p; //size of (*p)}
class emploee
{public:virtual ~emploee(){};}
Це був приклад з порожнім деструктором.
Void manager::~manager( )
{delete Listofsub;}
Приклад віртуального конструктора:
Class A{…}
Class B: public A{…};
A*p;
А
p
B
Маємо покажчик,але не знаємо на об”єкт якого типу-в цьому полягає віртуальність.
Постановка задачі для віртуал.конструкторів.Е-покажчик на якийсь об”кт,не відомо на який,треба створити екзкмпляр такого самого типу.Конструктор така ф-ція,що брати адресу чи застосовувати до нього операцію & компілятор не дозволяє.
Приклад:
Class A
{public: A();
virtual A*New obj ( );};
class B: public A
{public: B( );
virtual B*Newobj( )
{return NewB};};
A*p;
P=New B;
A*g=p->Newobj( );
B*pb;
… …
pa=pb;
Клонування:
Це створення ідентичної копії,для цього можна використовувати віртиальніконструктори.
Приклад:
Е-екземпляр якогось типу,треба не зная покажчика створити екземпляр цього ж самого типу та скопіювати його.
Схема:
Class C: public B
{public: C( );
virtual C*Newobj( )
{return New(c);}
virtual C*clone( );
private:
void copi(B*);
A*pa=NewC(p1,p2,…,pn);
. . . . . . .
A*pc=pa->clone(); //не знаємо тип ра}
Приклад клонування бынарного дерева
Це э загальнасхема клонування:эекземпляр типу с,треба незнаючи типу обьэкта створити ще один екземпляр,скопыювати в нього змыст попереднього обьэкту.
Class BinTree
{BinTree *left,*right;
public: BinTree ( );
BinTree (BinTree*l, BinTree*r);
Void copy(BinTree*t);virtual
BinTree ( );
Typedef int Tinfo;
Class BinTreeInfo: public BinTree
{Tinfo*info;
public: BinTree Info( );
BinTree Info (BinTree Info*l;
BinTree Info*r;
Tinfo*int);}
Void copy (BinTree *t);
Virtual BinTree Info*clone();};
Використання:
BinTree * BinTree::clone( )
{ BinTree*tmp; //Тимчасовий
tmp=New BinTree ;
//tmp->left=left; //не скопіювали
14. Ефективний доступ до членів класу .Дружні ф-ії та дружні класи .
Якщо тіло ф-ії оголошується в тілі класа то така ф-ія називається вбудованною .Від звичайного описання ф-ії вбудована відрізняється тим що в головній програмі :
- компілятор має більшу змогу оптимізації;
-вбудована ф-ія не
використовує стек;
Замість вбудованої ф-ії вставляється її тіло при копмпіляції ,тому що при потребі відкомппілювати головну програму повинно бути тіло вбудованної ф-ії. Прототип вбудованної ф-ії - inline.Описання ф-ії можно не вносити в описання класу,але треба додати специфікатор inline.
П-д:
Void main ( )
{g( par1,par2,…parN);}
Порядок обчислення параметрів справа наліво перед викликом ф-ії.Ф-ії члени класу та не члени класу.
П-д: class complex
{ public:
complex operator +(complex b);};//не дружня ф-ія
Розглянемо використання:
Void f( )
{ complex a,b,c;
….
c=a+b;//ok!
c=a+2;//треба конструктор який 2 перетворює в class complex
c=2+a;//треба змінювати тип першого операнда
В останньому прикладі треба зробити так:
Class complex
{ float Re,Im ;
public:
complex operator +=
(complex b);
{ Re+=b.Re;
Im+=b.Im;
return *this;}};
Якщо всеж нам потрібно виконати:
2+complex треба використати не члени класу.
Complex operator + (complex a, complex b);
Complex operator + (complex , double);
Complex operator +
(double , complex );
Дружні ф-ії та дружні класи.
Дружня ф-ія -це така ф-ія,яка оголошується в оголошенні класу з0 описувачем friend
П-д:class C
{ public:
…..
friend void f( ) ;}
friend вказує на те що ф-ія має доступ до всіх полів класу на рівні з ф-ми-членами класу.
Дружні ф-ії потрібні для того щоб дозволити доступ іншим ф-ям(не зовсім
Довільний доступ)до полів класу .Якщо хтось змінить тіло дружньої ф-ії то треба перекомпілювати всі модулі які використовують члени класу.П-д:
class Vector
{ int *V;
int size;
public:
Vector (…) //конструктор
Int elem(int i);
Class matrix
{Vector *m;
int size2;
public:
int elem(int x,int y);
void f( )
{ matrix M;
Vector V,V2;
…..
V2=M*V;
Дружні ф-ії має сенс описувати для зручносту доступу .Дружня ф-ія може бути дружня для декількох класів.Може
Бути декілька дружніх ф-ій для одного класу .Навіть можна для одного класу оголосити дружнім інший клас.