В чем разница между оператором присваивания и конструктором копирования?
Я не понимаю разницу между конструктором присваивания и конструктором копирования в 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);"
Разница между конструктором копирования и конструктором присваивания:
- В случае конструктора копирования он создает новый объект. (
<classname> <o1>=<o2>
) - В случае конструктора присваивания он не будет создавать никаких объектов, значит он применяется к уже созданным объектам (
<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
}
ВЫХОД
конструктор по умолчанию
конструктор копирования
конструктор по умолчанию
оператор присваивания
Я хочу добавить еще один момент по этой теме. "Операторная функция оператора присваивания должна быть записана только как функция-член класса". Мы не можем сделать это функцией друга в отличие от другого бинарного или унарного оператора.
Что-то добавить о конструкторе копирования:
При передаче объекта по значению он будет использовать конструктор копирования
Когда объект возвращается из функции по значению, он будет использовать конструктор копирования
При инициализации объекта используются значения другого объекта (в качестве примера вы приводите).