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

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

Код програми 3.13. Демонстрація механізму використання конструктора копії для ініціалізації одного об'єкта іншим

#include <vcl>

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

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

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

// Визначення звичайного конструктора

class myClass { int *р; public:

myClass(int с);

{ р = new int; *р = с;

cout«"Виділення р-пам'яті звичайним конструктором" « endl;} myCiass(const myCiass &obj); // Визначення конструктора копії {р = new int; *р = *obj.p;

cout«"Виділення р-пам'яті конструктором копії' « endl;}

~myCiass();

{delete р; cout«"Звільнення р-пам'яті" « endl;}

};

Int mainO

{

myCiass ObjA(IO); // Викликається звичайний конструктор. myCiass ObjB = ObjA; // Викликається конструктор копії. getchO; return 0;

}

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

Виділення р-пам'яті звичайним конструктором

Виділення р-пам'яті конструктором копії

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

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

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

Результати виконання цієї програми вказують на те, що при створенні об'єкта ObjA викликається звичайний конструктор. Але коли об'єкт ObjA використовують для ініціалізації об'єкта ObjB, то викликається конструктор копії. Його використан­ня гарантує, що об'єкт ObjB виділить для своїх членів-даних власну область дина­мічної пам'яті. Без конструктора копії об'єкт ObjB просто був би точною копією об'єкта ObjA, а член ObjA.p вказував би на ту ж саму область динамічної пам'яті, що і член ObjB.p.

Потрібно мати на увазі, що конструктор копії викликається тільки при вико­нанні ініціалізації об'єкта. Наприклад, така послідовність настанов не викличе конструктора копії, визначеного у попередній програмі: myCiass ObjA(2), ObjB(3);

II...

ObjB = ObjA;

У цьому записі настанова ObjB = ObjA здійснює операцію присвоєння, а не опе­рацію копіювання.

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

При передачі об'єкта функції як аргумента створюється побітова копія цього об'єкта. Якщо у класі визначено конструктор копії, то саме він і викликається для створення такої копії. Розглянемо код програми, у якій використовується конс­труктор копії для належного оброблення об'єктів типу myCiass під час їх передачі функції як аргументів. Нижче наведемо коректну версію некоректної програми, представленої у розд. 3.5.2.

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

#include <iostream> #include <conio> using namespace std;

class myClass { int *p; public:

myClass(int c)

#іпсІис)е <УСІ>

// Для потокового введення-виведення // Для консольного режиму роботи // Використання стандартного простору імен

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

// Визначення звичайного конструктора { р = new int; *р = с; cout«"Виділення р-пам'яті звичайним конструктором" « endl;} myClass(const myClass &obj); // Визначення конструктора копії {р = new int; *р = *obj.p;

cout«"Виділення р-пам'яті конструктором копії’1« endl;} -myClassO;

{delete р; cout«"Звільнення р-пам'яті" « endl;} int Put() {return *p;}

// Ця функція приймає один об'єкг-параметр. void Get(myClass obj)

{

cout«"*p=" « obj.PutO « endl;

}