Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

4.3 Досягнення високої ефективності. Конструктор копіювання.

Конструктор копiювання є конструктором особливого виду: вiн

приймає в якостi параметра константне посилання на об`єкт класу ( const тип_класу &) чи просте посилання на об`єкт( тип-класу &). Приклад:

class Card

{

int x,y;

public:

Card (const Card & src );

};

Card :: Card( const Card & src )

{

x=src.x;

y=src.y;}

Розглянемо , де бувають корисними конструктори копіювання. Розглянемо таку програму:

# define LARGE 30000

struct Lange

{

int data[LARGE];

Large (void)

{

for (int i=0; i<LARGE; i++)

data[i]=i;

}

~LARGE (void) {}

LARGE slow(Large b)

{

Large ans;

{ for (int i=0; i<LARGE; i++)

ans.data[i]=b.data[i];

return ans;

}

};

main ()

{

Large a,b;

{ for (int i=0; i<100; i++)

a=slow(b);

};

Час її роботи є порівняно великим. Як збільшити швидкодію ? Це можна зробити з використанням конструктора копіювання:

class Large1

{

private:

Large1 (const Large1 & b);

public:

int data[LARGE];

Large1 (void)

{

for (int i=0; i<LARGE; i++)

data[i]=i;

}

~LARGE1 (void) {}

};

Large1 :: Large1 (const Large1 & b);

{ for (int i=0; i<LARGE; i++)

data[i]=b.data[i];

}

inline Large1::fast (const Large1 & b)

{ return Large1(b);}

main ()

{

Large1 a,b;

{ for (int i=0; i<100; i++)

a=fast(b);

};

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

Контрольні запитання

1. Для чого введені конструктори та деструктори ?

2. Як описуються конструктори та деструктори?

3. Чи обов’язковим є наявність в класі конструкторів та деструкторів?

4. В чому полягає специфіка конструктора без параметрів ?

5. Що відбувається, якщо оголошується екземпляр класу, що не містить конструкторів ?

6. Чи можна викликати конструктори без створення екземпляру класу(ніби звичайну функцію-член)?

7. Чи можна перегружати конструктори?

8. Чи допускаються в конструкторах параметри по замовчуванню ?

9. Коли викликаються деструктори ?

10. Чи можна явно викликати деструктор класу?

11. Чи може мати деструктор параметри ?

12. Для чого використовується конструктор копіювання ?

Завдання 4:

1. Дописати в усіх створених в завданні 1 класах відповідні конструктори та деструктори.

2. Придумати та протестувати приклади виклику конструкторів для ситуації, аналогічної прикладу з класом str для інших типів даних.

3. Написати програму для ілюстрації автоматичного виклику деструкторів . Структури програми можна вибрати, наприклад, такі:

а)

class pr{

//...

public:

~pr()

{

cout<<"Деструктор \n";

}

};

void main(void)

{ pr p1;

{

pr p2;

{pr p3;

cout<<"\n Pa-Pa 3";

}

cout<<"\n Pa-Pa2";

}

cout<<"\n Pa-Pa1";

}

б) class pr{

//...

}

class pr1{

//...

}

. . .

void f()

{ pr a;

...

}

void f1()

{pr1 b;

...

f();

}

...

main()

{prn b;

f(); }

В деструкторах класів видаються відповідні повідомлення.

4. Придумати корисний тип даних, який не є вбудованим в жодній з мов програмування та реалізувати його як абстрактний тип даних С++. Описати відповідні конструктори та деструктори. Написати програму, що використовує цей тип даних.

5.Розробиити клас автомат з скінченною множиною станів. На основі цього класу побудувати модель марківського процесу з скінченною множиною станів (в кожен момент часу відбувається випадковий перехід в один з можливих станів) .

6. Модифікувати попередній приклад, задаючи певні закони переходу з одного стану в інший.

7. Модифікувати клас Автомат так, щоб за допомогою нього можна було будувати моделі n-вимірного марківського процесу з скінченною множиною станів.