Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_pz022 (1).doc
Скачиваний:
4
Добавлен:
29.08.2019
Размер:
239.62 Кб
Скачать

10. Конструктор базового класу. Ініціалізація полів кл

class employer {…};

class manager: public

employer {…};

спочатку працює конструктор базового типу

int level

{public:

manager(char * n, int a, int l )

{ level=l;};}

Інший приклад

class employer {..};

class manager : public employer

{int level ;

public:

manager(char * n, int a, int l): employer (n,n)

{ level = l;};};

Ініціалізація:

Complex ( )

{Re=0;Im=0;}

complex( ):Re(0),Im(0);

class C

{int & i;};

11.”Покажчик на себе”. Статичні поля класу.

This зарезервований за показжчиком на поточний еземпляр класу

Class A

{int x;

public:

void f(int)

}

class B

{public:

void g(int)

}

void A::f(int i)

{//this this->x=0

x=i;//this->x=1;

}

void B::g(int j)

{//this

}

void main()

{A a;

a.f(1);

}

this використовується явно в динамічних списках.

Статичні члени класу.

class C

{int a;};

c C1,C2;

int common;

class C

{ public:

void f( )

{ (common=2;}};

Недоліки:

1)програміст може забути ініціалізувати таку змінну; 2)спільна для екземплярів кл. змінна common є спільною і для небажаних доступів.

Через це є статичні дані кл.,які виділяються специфікатором static

class taskList

//одне звено у цьому списку

…

public:

static taskList *chain ;};

статичні властивості не дуб-лю-ються вони є спільними для всіх

taskList* taskList :: chain = 0;

taskList TL;

TL.info = ptr ;

Конструктор не виділяє пам’ять до статичних змінних,але він може робити ініціалізацію по відношенню до статичної змін-ної:

Void f( )

{ int i;

static c C ;//(1)екземпляр кл. С-статична змінна

if ( i )

{static c C ;}}//(2)

при вході в блок f ініціалізація С буде один єдиний раз ,тобто

(2) відбувається,а(1)ні

class C

{ public:

static void f( ) ; };//ця ф-ія не буде приймати участь

--------- 13 ---------------------

//tmp->right=right; //тількипереприсвоїли покажчик

if (left) tmp->left->copy(left)

if(right) tmp->right->copy(right)

return tmp;};

------- 13 -------------------------

12.Конкретні і абстрактні типи. Віртуальні ф-ії.

П-д:

Class stack

{char *s;

int top;

int stacksize;

public:

char pop( );

void push(char);

stack( );

stfck(int size);}

char stack :: pop( )

{ return s[top--];}

П-д абстрактної реалізації стека:

Void f(stack & stk )

{stk.push ('C');

if (stk pop( )!='C'_

error(…); }

Інший приклад більш абстрактного використаня:

class stack

{ public:

virtual void push (char)=0;

virtual char pop ( )=0;};

Абстрактний класс дозволяє не перекомпільовувати вихідні тексти програм

які користуються цим типом при зміні реалізації.Абстрактний тип вимагає того ,щоб нижче в програмі він був довизначений в якомусь похідному класі.Для абстрактого класу не можна описувати екземпляри.

П-д:

Void main ( )

{array_stack as(100);

f(as);

……}

class array_stack :

public stack

{char*V;

int top;int sfacksize;

public:

//конструктори

char pop( );

void public char;};

Описувач virtual можна не ставити так як абстрактний тип передбачає це.

Підсумок:абстрактні класи дозволяють досягти незалежності інтерфейсу від реалізіції.

Віртуальні функції.

П-д:

Class A

{ public:

void f( )

{ cout <<"клас А"}};

Class B:public A

{ public:

void f( )

{ cout <<"клас B"}};

void g( );

{ A a ; B b ; a.f( );b.f( );

g1(&a); g1(&b);}

void g1(A*pa)

{ paf( ); }

З кожнисм класом які мають віртіальні ф-ії пов"язується таблиця.(vtbl).З кожним екземпляром класу пов"язується один покажчик

Покажчик на екземпляр 

екземпляр покажчик на vtbl  покажчик на ф-ію.

1)ефективність використання з точки зору обчислювальної складності;

2) ефективність використання з точки зору швидкості виконання ;

3) розподілу пам"яті.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]