РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
686 of 815 menu

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

Конструктор копирования - это специальный метод класса, который создает новый объект как копию уже существующего объекта того же типа. Он вызывается автоматически, когда происходит копирование объекта: при инициализации нового объекта другим объектом, при передаче объекта в функцию по значению, а также при возврате объекта из функции по значению. В первый параметр конструктор копирования принимает константную ссылку на объект того же класса, из которого нужно скопировать данные. Если конструктор копирования не определен явно, компилятор создает его автоматически, выполняя почленное копирование всех полей класса.

Синтаксис

ClassName(const ClassName& other);

Пример

Давайте создадим класс Point с явным конструктором копирования, который выводит сообщение при копировании:

#include <iostream> using namespace std; class Point { public: int x; int y; Point(int x, int y) : x(x), y(y) {} Point(const Point& other) { x = other.x; y = other.y; cout << "Copy constructor called" << endl; } }; int main() { Point a(1, 2); Point b = a; cout << b.x << " " << b.y << endl; return 0; }

Результат выполнения кода:

"Copy constructor called" 1 2

Пример

Давайте создадим класс Array, который владеет динамическим массивом, и напишем корректный конструктор копирования с глубоким копированием данных:

#include <iostream> using namespace std; class Array { private: int* data; int size; public: Array(int size) : size(size) { data = new int[size]; for (int i = 0; i < size; i++) data[i] = 0; } Array(const Array& other) : size(other.size) { data = new int[size]; for (int i = 0; i < size; i++) data[i] = other.data[i]; } ~Array() { delete[] data; } void set(int index, int value) { data[index] = value; } int get(int index) const { return data[index]; } }; int main() { Array a(3); a.set(0, 1); a.set(1, 2); a.set(2, 3); Array b = a; b.set(0, 100); cout << a.get(0) << " " << b.get(0) << endl; return 0; }

Результат выполнения кода:

1 100

Благодаря глубокому копированию объекты a и b имеют независимые массивы, и изменение одного не влияет на другой.

Пример

Давайте посмотрим, как конструктор копирования вызывается при передаче объекта в функцию по значению:

#include <iostream> using namespace std; class Number { public: int value; Number(int value) : value(value) {} Number(const Number& other) : value(other.value) { cout << "Copied" << endl; } }; void print(Number n) { cout << n.value << endl; } int main() { Number num(42); print(num); return 0; }

Результат выполнения кода:

"Copied" 42

Смотрите также

  • конструктор constructor,
    который инициализирует объект класса
  • деструктор destructor,
    который освобождает ресурсы объекта
  • конструктор перемещения move constructor,
    который перемещает данные из другого объекта
  • оператор присваивания копированием copy assignment,
    который копирует данные в существующий объект
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить