
Давайте изучим разницу между конструктором копирования и оператором присваивания.
Сравнительная таблица
Основа для сравнения | Копировать конструктор | Оператор присваивания |
---|---|---|
основной | Конструктор копирования является перегруженным конструктором. | Оператор присваивания является побитовым оператором. |
Имея в виду | Конструктор копирования инициализирует новый объект уже существующим объектом. | Оператор присваивания присваивает значение одного объекта другому объекту, оба из которых уже существуют. |
Синтаксис | имя_класса (продолжение имя_класса и имя_объекта) { // тело конструктора } | имя_класса 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.
Когда выполняется побитовое присвоение, оба объекта совместно используют одну и ту же ячейку памяти, и изменения в одном объекте отражаются в другом объекте.
Ключевые различия между конструктором копирования и оператором присваивания
- Конструктор копирования является перегруженным конструктором, где в качестве оператора присваивания используется побитовый оператор.
- Используя конструктор копирования, вы можете инициализировать новый объект уже существующим объектом. С другой стороны, оператор присваивания копирует один объект в другой объект, оба из которых уже существуют.
- Конструктор копирования инициализируется всякий раз, когда новый объект инициализируется уже существующим объектом, когда объект передается в функцию в качестве параметра без ссылки или когда объект возвращается из функции. С другой стороны, оператор присваивания вызывается только тогда, когда объект назначается другому объекту.
- Когда объект инициализируется с помощью конструктора копирования, инициализирующий объект и инициализированный объект совместно используют разные места в памяти. С другой стороны, когда объект инициализируется с использованием оператора присваивания, тогда инициализированный и инициализирующий объекты совместно используют одну и ту же область памяти.
- Если вы явно не определяете конструктор копирования, тогда его предоставляет компилятор. С другой стороны, если вы не перегружаете оператор присваивания, то выполняется операция побитового копирования.
Заключение:
Конструктор Copy лучше всего подходит для копирования одного объекта в другой, когда объект содержит необработанные указатели.