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

Конструктор копіювання необхідний для того, щоб ми могли створювати «реальні» (а не побітові) копії для об'єктів класу. Така копія об'єкта може знадобитися в наступних випадках:
- при передачі об'єкта класу в функцію, як параметра за значенням (а не за посиланням);
- при поверненні з функції об'єкта класу, як результату її роботи;
- при ініціалізації одного об'єкта класу іншим об'єктом цього класу.
Використання конструктора копіювання - прекрасний спосіб обійти ці помилки і проблеми. Він створить «реальну» копію об'єкта, яка буде мати особисту область динамічної пам'яті.
Конструктор копіювання синтаксично виглядає так:
Нижче розберемо нескладний, але дуже показовий приклад. У ньому будуть розглянуті всі 3 випадки в яких бажано застосовувати конструктор копіювання. Буде створено клас, що містить конструктор без параметрів, конструктор копіювання і деструктор. Щоб приклад був не надто громіздким, конструктори і деструктор будуть виводити на екран повідомлення типу «Спрацював конструктор», «Спрацював дектруктор» ... Відбирати і звільняти пам'ять не будемо. Нам відмінно буде видно скільки разів спрацюють конструктори а скільки разів деструктор. Очевидно, що деструкція (якби він звільняв пам'ять) не повинен спрацьовувати більшу кількість разів, ніж конструктор, який виділяє пам'ять.
Конструктор копіювання в С ++
Запустивши програму побачимо в консолі наступне:

Подивимося що програма видала в консоль. Блок 1 - під час створення нового об'єкта, спрацював конструктор без параметрів. У блоці 2 ми розмістили функцію showFunc (). Під час передачі в неї «об'єкта-параметра» за значенням, спрацював конструктор копіювання і створилася «реальна» копія об'єкта класу OneClass. При виході з цієї функції спрацював деструктор, так як копія об'єкта знищується. До речі, те, що передача об'єкта як параметра за значенням, викликає конструктор копіювання, служить відмінним приводом для передачі об'єкта по посиланню. Це заощадить і час і пам'ять.
У блоці 3 розміщена функція returnObjectFunc (). Так як в її тілі прописано створення нового об'єкта класу OneClass - спочатку спрацював конструктор без параметрів. Далі виконується код функції і під час повернення об'єкта в головну функцію main. спрацював конструктор копіювання. В кінці, як і повинно бути, деструктор відпрацював двічі: для об'єкта і для його реальної копії.

У цій ситуації, якщо б деструктор звільняв пам'ять - в програмі виникла б помилка.
Дуже рекомендую прочитати тему Конструктор копіювання в книзі Стівена Прата «Мова програмування С ++. Лекції і вправи. 6-е видання. »Вона розкрита набагато глибше і включає всі основні нюанси використання конструктора копіювання. Докладно розглянута операція присвоювання =.
Щоб підтримати наш сайт - натисніть на скарбничку і виберіть будь-який зручний спосіб.