Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать

Int mainO

{

myClass ObjA(10); // Створення об'єкта класу

Get(ObjA);

getchO; return 0;

}

Внаслідок виконання ця програма відображає на екрані такі результати: Виділення р-пам'яті звичайним конструктором Виділення р-пам'яті конструктором копії *р= 10

Звільнення р-пам'яті Звільнення р-пам'яті

У процесі виконання цієї програми тут відбувається таке: коли у функції та- іпО створюється об'єкт ObjA, "стараннями" звичайного конструктора виділяється область пам'яті, адреса якої присвоюється покажчику ObjA.p. Потім об'єкт ObjA пе­редається функції Get(), а саме - її параметру obj. У цьому випадку викликається конструктор копії, який для об'єкта ObjA створює побітову його копію з іменем obj. Конструктор копії виділяє пам'ять для цієї копії, а значення покажчика на виділе­ну область пам'яті присвоює члену р об'єкта-копії. Потім значення, яке адре­сується покажчиком р початкового об'єкта, записується в область пам'яті, адреса

якої зберігається в покажчику р об'єкта-копії. Таким чином, області пам'яті, що адресуються покажчиками ObjA.p і obj.p, є різними та незалежними одна від одної, але значення (на які вказують ObjA.p і obj.p), що зберігаються в них, однакові. Якби конструктор копії у класі myClass не був завчасно визначений, то внаслідок ство­рення за замовчуванням побітової копії члени ObjA.p і obj.p указували б на одну і ту саму область пам'яті.

Після завершення роботи функції GetO об'єкт obj виходить з області видимос­ті. Цей вихід супроводжується викликом його деструктора, який звільняє область пам'яті, яка адресується покажчиком obj.p. Нарешті, після завершення роботи фун­кція mainO виходить з області видимості об'єкт ObjA, що також супроводжується викликом його деструктора і відповідним звільненням області пам'яті, яка адре­сується покажчиком ObjA.p. Як бачимо, використання конструктора копії усуває негативні побічні ефекти, пов'язані з передачею об'єкта функції.

  1. Механізм використання конструктора копії при поверненні функцією об'єкта

Конструктор копії також викликається при створенні тимчасового об'єкта, який є результатом повернення функцією об'єкта. Для розуміння сказаного роз­глянемо таку навчальну програму.

Код програми 3.15. Демонстрація механізму використання конструктора копії для створення тимчасового об'єкта, що повертається фун­кцією

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

class myClass { // Оголошення класового типу

public:

myClassO {cout«"Звичайний конструктор" « endl;}

myClass(const myClass &obj) {cout«"Конструктор копії’1« endl;}

};

myClass FunO {

myClass obj; // Викликається звичайний конструктор, return obj; // Опосередковано викликається конструктор копії.

}

Int mainO

{

myClass ObjA; // Викликається звичайний конструктор.

ObjA = FunO; Ч Викликається конструктор копії. getchO; return 0;

}

Внаслідок виконання ця програма відображає на екрані такі результати:

Звичайний конструктор

Звичайний конструктор

Конструктор копії

Тут звичайний конструктор викликається двічі: перший раз при створенні об'єкта ObjA у функції mainO, другий - при створенні об'єкта obj у функції Fun(). Конструктор копії викликається в ту мить, коли генерується тимчасовий об'єкт як значення, яке повертається з функції Fun().

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