В чем разница между оператором присваивания и конструктором копирования?

Я не понимаю разницу между конструктором присваивания и конструктором копирования в C++. Это так:

class A {
public:
    A() {
        cout << "A::A()" << endl;
    }
};

// The copy constructor
A a = b;

// The assignment constructor
A c;
c = a;

// Is it right?

Я хочу знать, как выделить память конструктора присваивания и конструктора копирования?

8 ответов

Решение

Конструктор копирования используется для инициализации ранее неинициализированного объекта из данных другого объекта.

A(const A& rhs) : data_(rhs.data_) {}

Оператор присваивания используется для замены данных ранее инициализированного объекта данными некоторых других объектов.

A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}

Вы можете заменить конструкцию копирования конструкцией по умолчанию плюс присвоение, но это будет менее эффективно.

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

Разница между конструктором копирования и оператором присваивания создает много путаницы для новых программистов, но на самом деле это не так уж сложно. Подводя итог:

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

Пример для оператора присваивания:

Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator

Пример для конструктора копирования:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor

Первый - инициализация копии, второй - просто присвоение. Там нет такого понятия, как конструктор присваивания.

A aa=bb;

использует созданный компилятором конструктор копирования.

A cc;
cc=aa;

использует конструктор по умолчанию для создания cc, а затем * оператор присваивания ** (operator =) на уже существующем объекте.

Я хочу знать, как выделить память конструктора присваивания и конструктора копирования?

IDK, что вы подразумеваете под выделением памяти в этом случае, но если вы хотите увидеть, что происходит, вы можете:

class A
{
public :
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

Я также рекомендую вам взглянуть на:

Почему конструктор копирования вызывается вместо конструктора преобразования?

Что такое правило трех?

Проще говоря,

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

Пример-

t2 = t1;  // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1;  // calls copy constructor, same as "Test t3(t1);"

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

  1. В случае конструктора копирования он создает новый объект. (<classname> <o1>=<o2>)
  2. В случае конструктора присваивания он не будет создавать никаких объектов, значит он применяется к уже созданным объектам (<o1>=<o2>).

И основные функции в обоих одинаковы, они будут копировать данные из o2 в o1 для каждого члена.

Что @Luchian Grigore Said реализовано так

class A
{
public :
    int a;
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

void main()
{
    A sampleObj; //Calls default constructor
    sampleObj.a = 10;

    A copyConsObj  = sampleObj; //Initializing calls copy constructor

    A assignOpObj; //Calls default constrcutor
    assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}

ВЫХОД


конструктор по умолчанию


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


конструктор по умолчанию


оператор присваивания


Я хочу добавить еще один момент по этой теме. "Операторная функция оператора присваивания должна быть записана только как функция-член класса". Мы не можем сделать это функцией друга в отличие от другого бинарного или унарного оператора.

Что-то добавить о конструкторе копирования:

  • При передаче объекта по значению он будет использовать конструктор копирования

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

  • При инициализации объекта используются значения другого объекта (в качестве примера вы приводите).

Другие вопросы по тегам