конструктор копіювання

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

Якщо два об'єкти мають один і той же тип, то можна привласнювати один об'єкт іншому. Це означає, що дані об'єкта з правого боку рівності будуть скопійовані в дані об'єкта з лівої сторони рівності. Наприклад, наступна програма виводить значення 99:

void set_i (int n)

myclass ob1, ob2;

ob2 = ob1; // привласнення даних ob1 об'єкту ob2

cout <<"this is ob2's i: " <

За замовчуванням всі дані одного об'єкта присвоюються іншому шляхом побітового копіюв-вання. Однак можливо перевантажити оператор присвоювання і визначити деякі інші процедури присвоєння.

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

ім'я_класу (const ім'я_класу оbj)

Ініціалізація виникає в трьох випадках: коли один об'єкт инициализирует інший, коли ко-пія об'єкта передається в функцію і коли створюється тимчасовий об'єкт (зазвичай він служить повертається значенням). Наприклад, будь-яка з наступних інструкцій викликає ініціалізацію:

myclass x = у; // ініціалізація

F (x); // передача параметра

У = F1 (); // отримання тимчасового об'єкта

Нижче наведено приклад, де є потреба у явний конструктор копіювання. Ця програма со-здает дуже простий «безпечний» тип масиву цілих чисел, що запобігає висновок за межі-ці масиву. Пам'ять для кожного масиву виділяється з використанням оператора new і в кожному об'єкті підтримується робота з покажчиком на виділену пам'ять.