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

13.7.3. Використання конструктора копії під час повернення функцією об'єкта

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

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

#include <vcl>

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

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

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

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

public:

myClass() { cout << "Звичайний конструктор.\n";}

myClass(const myClass &obj) {cout << "Конструктор копії.\n";}

};

myClass fun_ob()

{

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

return a_ob; // Опосередковано викликається конструктор копії.

}

int main()

{

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

A_ob = fun_ob(); // Викликається конструктор копії.

getch(); return 0;

}

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

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

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

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

Тут звичайний конструктор викликається двічі: перший раз під час створення об'єкта A_ob у функції main(), другий – під час створення об'єкта a_ob у функції fun_ob(). Конструктор копії викликається в ту мить, коли генерується тимчасовий об'єкт як значення, що повертається з функції fun_ob().

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

13.7.4. Конструктори копії – а чи не можна знайти щось простіше?

Як ми вже неодноразово згадували раніше, C++ – дуже потужна мова програмування. Вона має багато засобів, які надають їй широкі можливості, але при цьому її можна назвати складною мовою. Конструктори копії є механізмом, на який посилаються багато програмістів як на основний приклад складності мови, оскільки цей засіб не сприймається на інтуїтивному рівні. Програмісти-початківці часто не розуміють, чому так важливі конструктори копії. Для багатьох не відразу стає очевидним відповідь на запитання: коли потрібен конструктор копії, а коли – ні. Ця ситуація часто виражається в такій формі: "А чи не існує простішого способу?". Відповідь також непроста: і так, і ні!

Такі мови програмування, як Java і С#, не мають конструкторів копії, оскільки в жодній з них не створюються побітові копії об'єктів. Йдеться про те, що як Java, так і С# динамічно виділяють пам'ять для всіх об'єктів, а програміст оперує цими об'єктами виключно через посилання. Тому під час передачі об'єктів як параметрів функції або під час повернення їх з функцій в копіях об'єктів немає ніякої потреби.

Той факт, що ні Java, ні С# не потребують конструкторів копії, робить ці мови простішими, але за простоту теж потрібно платити. Робота з об'єктами виключно за допомогою посилань (а не безпосередньо, як у мові програмування C++) накладає обмеження на тип операцій, які може виконувати програміст. Понад це, таке використання об'єктних посилань в Java і С# не дає змоги точно визначити, коли об'єкт буде зруйнований. У мові програмування C++ об'єкт завжди руйнується при виході з області видимості.

Мова C++ надає програмісту повний контроль над ситуаціями, що виникають у програмі, тому вона є дещо складнішою, ніж мови Java і С#. Це – ціна, яку ми платимо за потужні засоби програмування.