Разница между выделением памяти для данных типа Obj в функции перегрузки оператора = и конструкторе копированияC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Разница между выделением памяти для данных типа Obj в функции перегрузки оператора = и конструкторе копирования

Сообщение Anonymous »

Предположим, у нас есть следующие 2 класса:

Код: Выделить всё

class Class1
{
private :
Class2 *obj;
public:
Class1();
Class1(const Class1 &other);
Class1 & operator=(const Class1 & obj)
~Class1();
}

class Class2
{
Class2();
Class2(const Class2 &other);
Class2 & operator=(const Class2 & obj)
~Class2();
}
Мы все согласны с тем, что конструктор копирования копирует данные из существующего источника объекта в новый экземпляр объекта, и для большинства реализованных мною конструкторов копирования это выглядит так:

Код: Выделить всё

Class1::Class1(const Class1 &other)
{
*this = other;
}
Приведенный выше код в значительной степени помогает нам реализовать перегрузку оператора функции "=", которая в основном используется для копирования данных из существующего объекта в другой существующий объект и реализация которой :

Код: Выделить всё

Class1 & Class1::operator(const Class1 & obj)
{
if(this != &other)
this->data = obj.data
return *this;
}
Теперь, например, мы хотим разместить внутри этого класса Class1 переменную типа Obj, эти два метода будут выглядеть так:

Код: Выделить всё

Class1::Class1(const Class1 &other)
{
this->obj = new Class2();
*this = other;
}

Class1 & Class1::operator(const Class1 & obj)
{
if(this != &other)
{
this->data = obj.data
this->obj = new Class2();
}
return *this;
}
Мой вопрос: поскольку конструктор копирования использует *this = Other , который копирует источник obj в новое место назначения obj (включая this->obj = new Class2(), который выделит для нового объекта), почему нам нужно снова выделять память в конструкторе копирования, в то время как об этом позаботится оператор =.
Я знаю, что это называется глубоким копированием, которое позволяет каждому экземпляру class1 иметь собственную переменную типа Class2 и избегать использования адреса общей памяти, чтобы изменения одного объекта экземпляра Class1 не влияли на другой объект того же типа.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ator-overl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»