Конструктор копирования C ++ — это функция-член, которая инициализирует объект, используя другой объект того же класса. Конструктор копирования — это перегруженный конструктор, используемый для объявления и инициализации объекта из другого объекта.
- Конструктор копирования C ++
- Прототип конструктора копирования
- # Пример конструктора копирования
- # Концепция глубокого копирования и поверхностного копирования
- #Shallow Copy of Constructor in C ++
- #Deep Copy of Constructor в C ++
- # Разница между конструктором копирования и оператором присваивания
- Рекомендуемые сообщения
Конструктор копирования C ++
Копия — это тип конструктора, который используется для создания копии уже существующего объекта тип класса. Конструктор копирования используется, когда переменные-члены одного объекта инициализируются значениями переменной-члена другого объекта того же класса.
Помимо конструктора по умолчанию и параметризованного конструктора, существует третий тип конструктора с именем конструктора копирования.
Прототип конструктора копирования
имя_класса (const имя_класса и старый_объект);
Старый объект следует передать как ссылку на аргумент; в противном случае будет цепочка безостановочных вызовов.
Кроме того, аргумент конструктора копирования должен быть const , потому что мы не хотите, чтобы значения старых объектов изменялись внутри тела этого конструктора.
Итак, если мы не хотим, чтобы аргумент, передаваемый функции, каким-либо образом изменялся, мы используем ключевое слово const .
Когда вызывается конструктор копирования?
- Когда функция возвращает объект класс.
- Когда объект класса передается в качестве аргумента функции.
# Пример конструктора копирования
См. следующий код.
#include using namespace std; class A {int x, y; public: A () {cout неявный A obj2 (obj); //Копируем конструктор под названием старый объект 'obj' передается obj2.print (); return 0;}
См. следующий результат.
В приведенном выше коде создаются два объекта, а именно obj и obj2, . Первый объект obj использует параметризованный конструктор для его создания.
Это приводит к присвоению значений 10 и 20 переменным-членам объекта obj. Затем создается объект obj2 с использованием объекта obj. Объект obj передается в качестве аргумента. Это приводит к присвоению «x = old.x» и «y = old.y».. ‘
# Концепция глубокого копирования и поверхностного копирования
Даже если мы не определяем конструктор копирования явно внутри класса, он по-прежнему будет вызывать конструктор копирования по умолчанию.
#Shallow Copy of Constructor in C ++
В конструкторе копирования по умолчанию происходит неглубокая копия .
При поверхностном копировании переменные нового объекта получают значения старого объекта, но они указывают на ту же память, что и у старого объекта. То есть для нового объекта новая память не выделяется; они предназначены только для того, чтобы указывать на фактическую ячейку памяти, чтобы получить то же значение, что и у старого объекта.
Итак, если у нас есть динамическое размещение в нашей программе, мы не можем просто зависеть от конструктора по умолчанию, потому что он выполняет мелкую копию.
Мелкие копии копий ссылки на оригинальные объекты. Компилятор предоставляет конструктор копирования по умолчанию.
Конструктор копирования по умолчанию предоставляет мелкую копию, как показано в примере ниже. Это побитовая копия объекта.
Конструктор неглубокой копии используется, когда класс не имеет дела с какой-либо динамически выделяемой памятью.
Теперь посмотрим на код ниже.
#include #include using namespace std; class A {int x, y; public: A () {cout неявный A obj2 (obj); //Копируем конструктор под названием старый объект 'obj' передается obj2.print (); return 0;}
Теперь посмотрите на результат ниже.
В приведенном выше коде внутри класса A есть закомментированная функция, которая делает то, что по умолчанию делает компилятор в случае неглубокой копии.
Здесь созданы два объекта. Первый — с помощью простого параметризованного конструктора.
Второй использует конструктор копирования и ему передается первый объект. Тело функции конструктора копирования присваивает новый ‘x = old.x’ и новый ‘y = old.y’.
#Deep Copy of Constructor в C ++
Глубокая копия отличается от неглубокой копии, поскольку в этом случае мы создаем новую память для каждой переменной, а затем присваиваем то же значение, что и старое значение старого объекта.
Итак, если внутри программы есть динамическое распределение, то мы должны создать наш определяемый пользователем конструктор копирования, в котором сначала выделяется память, а затем присваивается ей значение.
Глубокая копия выделяет отдельную память для скопированной информации.
Итак, источник и копия разные. Любые изменения, сделанные в одной ячейке памяти, не повлияют на копию в другой ячейке.
Когда мы выделяем динамическую память с помощью указателей, нам нужен определяемый пользователем конструктор копирования. Оба объекта будут указывать на разные участки памяти.
См. ниже пример кода.
#include #include using namespace std; class A {char * s; public: A () {cout неявный A obj2 (obj); //Копируем конструктор под названием старый объект 'obj' передается obj2.print (); return 0;}
См. следующий результат.
В коде, упомянутом ниже, были созданы два объекта obj и obj2 . Параметризованный конструктор просто инициализирует первый объект.
Конструктор копирования инициализирует второй объект obj2. В функции конструктора копирования реализована глубокая копия.
Сначала мы вычисляем длину строки, содержащейся в старом объекте, затем новый массив символов, длина которого на единицу больше длины строки старого объекта. Затем выполняется цикл для присвоения новой строке значения другого строкового символа по символу.
# Разница между конструктором копирования и оператором присваивания
Оператор присваивания вызывается, когда уже инициализированному объекту присваивается уже созданный объект. В конструкторе копирования новому объекту назначается уже инициализированный объект.
Имя_класса A, B; Имя_класса C = B; //Копируем вызываемый конструктор. C - новое имя objectClass_name A = C; //Оператор присваивания. A уже инициализированный объект.
Наконец, пример конструктора копирования C ++ | Конструктор копирования в C ++ завершен.
Рекомендуемые сообщения
Пример деструктора C ++
Перегрузка конструктора в C ++
Перегрузка оператора в C ++
Переопределение функций в C ++
Перегрузка функций в C ++