Рекомендуем, 2020

Выбор редакции

Разница между конструктором копирования и оператором присваивания в C ++

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

Давайте изучим разницу между конструктором копирования и оператором присваивания.

Сравнительная таблица

Основа для сравненияКопировать конструкторОператор присваивания
основнойКонструктор копирования является перегруженным конструктором.Оператор присваивания является побитовым оператором.
Имея в видуКонструктор копирования инициализирует новый объект уже существующим объектом.Оператор присваивания присваивает значение одного объекта другому объекту, оба из которых уже существуют.
Синтаксисимя_класса (продолжение имя_класса и имя_объекта) {
// тело конструктора
}
имя_класса Ob1, Ob2;
Ob2 = OB1;
Запускает(1) Конструктор копирования вызывается, когда новый объект инициализируется с существующим.
(2) Объект передается функции в качестве нереферентного параметра.
(3) Объект возвращается из функции.
Оператор присваивания вызывается только при назначении существующему объекту нового объекта.
Выделение памятиИ целевой объект, и инициализирующий объект находятся в разных местах памяти.И целевой объект, и инициализирующий объект используют одну и ту же выделенную память
По умолчаниюЕсли вы не определяете конструктор копирования в программе, компилятор C ++ неявно предоставляет его.Если вы не перегружаете оператор «=», будет сделана побитовая копия.

Определение Копирующего Конструктора

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

 имя_класса (имя_класса & имя_объекта) {. // тело конструктора копирования. } // имя_объекта ссылается на объект в правой части инициализации. 

Если программист не создает конструктор копирования в программе на C ++, то компилятор неявно предоставляет конструктор копирования. Неявный конструктор копирования, предоставляемый компилятором, делает членскую копию исходного объекта. Но иногда для каждого члена копии недостаточно, поскольку объект может содержать переменную-указатель. Копирование переменной указателя означает, что мы копируем адрес, сохраненный в переменной указателя, но мы не хотим копировать адрес, сохраненный в переменной указателя, вместо этого мы хотим скопировать то, на что указывает указатель. Следовательно, существует необходимость в явном «конструкторе копирования» в программе для решения такого рода проблем.

Конструктор копирования вызывается в трех условиях:

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

Давайте разберемся с конструктором копирования на примере.

 экземпляр класса {int num; public: copy () {} // конструктор по умолчанию copy (int a) {// инициализирующий конструктор num = a; } copy (copy & c) {// Конструктор копирования num = c.num; } void show () {cout << num; }}; int main () {копия A (200); // Объект A создан и инициализирован copy B (A); // Копировать конструктор с именем copy C = A; // Копировать конструктор с именем copy D; D = A; // Копировать конструктор не вызван, потому что объект D не новый объект. // это операция присваивания. вернуть 0; } 

В приведенном выше коде я явно объявил конструктор «copy (copy & c)». Этот конструктор копирования вызывается, когда объект B инициализируется с использованием объекта A. Во второй раз он вызывается, когда объект C инициализируется с использованием объекта A. Когда объект D инициализируется с использованием объекта A, конструктор копирования не вызывается, поскольку при инициализации D оно уже существует, а не вновь созданное. Следовательно, здесь вызывается оператор присваивания.

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

Оператор присваивания является оператором присваивания C ++. Оператор «=» используется для вызова оператора присваивания. Он копирует данные в одном объекте идентично другому объекту. Оператор присваивания копирует один объект в другой для каждого члена. Если вы не перегружаете оператор присваивания, он выполняет побитовое копирование. Поэтому вам необходимо перегрузить оператор присваивания.

 экземпляр класса {int num; public: copy () {} // конструктор по умолчанию copy (int a) {// инициализирующий конструктор num = a; } void show () {cout << num; }}; int main () {копия A (200); // Объект A создал и инициализировал копию B (300); // Объект B создан и инициализирован B = A; // оператор присваивания вызвал copy C; С = А; // вызван оператор присваивания return 0; } 

В приведенном выше коде, когда объект A назначен объекту B, оператор присваивания вызывается, поскольку оба объекта уже существуют. Аналогичным образом, тот же самый случай, когда объект C инициализируется с объектом A.

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

Ключевые различия между конструктором копирования и оператором присваивания

  1. Конструктор копирования является перегруженным конструктором, где в качестве оператора присваивания используется побитовый оператор.
  2. Используя конструктор копирования, вы можете инициализировать новый объект уже существующим объектом. С другой стороны, оператор присваивания копирует один объект в другой объект, оба из которых уже существуют.
  3. Конструктор копирования инициализируется всякий раз, когда новый объект инициализируется уже существующим объектом, когда объект передается в функцию в качестве параметра без ссылки или когда объект возвращается из функции. С другой стороны, оператор присваивания вызывается только тогда, когда объект назначается другому объекту.
  4. Когда объект инициализируется с помощью конструктора копирования, инициализирующий объект и инициализированный объект совместно используют разные места в памяти. С другой стороны, когда объект инициализируется с использованием оператора присваивания, тогда инициализированный и инициализирующий объекты совместно используют одну и ту же область памяти.
  5. Если вы явно не определяете конструктор копирования, тогда его предоставляет компилятор. С другой стороны, если вы не перегружаете оператор присваивания, то выполняется операция побитового копирования.

Заключение:

Конструктор Copy лучше всего подходит для копирования одного объекта в другой, когда объект содержит необработанные указатели.

Top