Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Конструкторы и деструкторы.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
78.38 Кб
Скачать

Конструктор копирования.

Конструктор копирования вызывается, когда:

  1. надо создать объект, полностью совпадающий с уже созданным;

  2. надо передать по значению в некоторую функцию экземпляр класса, при этом в стеке создается локальная копия объекта, с которым и работает функция;

  3. надо создать объект полностью идентичный объекту, который возвращает некоторая функция посредством оператора return.

В большинстве случаев компилятор предоставляет нам конструктор копирования по умолчанию, который обеспечивает правильное копирование.

Рассмотрим копирование с использованием конструктора копирования по умолчанию:

class T {

int x, y ;

public:

T ( int tx, int ty ) { x = tx; y = ty; }

int GetX ( ) { return x; }

int GetY ( ) { return y; }

friend T sum ( T, T);

};

void Print ( T obj ) {

cout<<'\n'<<" x = "<<obj.GetX( ) <<" y = "<<obj.GetY( );

}

T sum ( T obj1, T obj2 ){

obj1. x + = obj2. x;

obj1. y + = obj2. y;

return obj1;

}

#include <iostream>

using namespace std;

int main () {

T e1 (1, 10);

//создается объект, вызывается конструктор с параметрами

Print (e1); //создание локальной копии объекта e1

Te2 = e1; //создание объекта e2 копированием объекта e1

Print (e2); //создание локальной копии объекта e2

Te3 = sum (e1, e2); //создание локальных копий объектов ee2

//и создание объекта e3 копированием объекта, возвращаемого функцией sum()

Print (e3); //создание локальной копии объекта e3

return 0;}

Результат программы:

x= 1 y = 10

x= 1 y = 10

x= 2 y = 20

Определение конструктора копирования.

При поиске формы определения конструктора копирования следует учесть следующие соображения.

Во-первых, объект, копия которого создается, не должен копироваться в конструктор копирования, а должен передаваться в него по ссылке. Иначе в конструкторе копирования вызывался бы сам конструктор копирования и возникала бы бесконечная рекурсия.

И во-вторых – необходимо ввести запрет на модификацию копируемого объекта, и для этого следует перед объектом - параметром поставить ключевое слово const.

Учитывая вышесказанное, формат определения конструктора копирования для описанного выше класса должен быть следующим:

T ( const T &obj ) { x = obj.x; y = obj. y;}

Если пользователь определил в классе конструктор копирования, то в случаях создания объектов – копий будет вызываться конструктор копирования, определенный в классе.

Однако свой конструктор копирования нужен не всегда. Копирование по умолчанию (когда конструктор копирования предоставляет компилятор) осуществляет как правило правильное копирование полей данных и без явного определения в классе конструктора копирования.

Обязательное его определение должно быть в тех случаях, когда класс содержит поля, являющиеся указателями на динамические участки памяти, при создании так называемых ресурсоемких объектов.

Прежде чем рассмотрим копирование ресурсоемких объектов, рассмотрим еще один очень важный метод классов, называемый деструктором.