Какая разница между оператором присваивания и конструктором копирования?
Я не понимаю разницы между конструктором присваивания и конструктором копирования в С++. Это примерно так:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
Я хочу знать, как выделить память конструктора присваивания и конструктора копирования?
Ответы
Ответ 1
Конструктор копирования используется для инициализации ранее неинициализированного объекта из некоторых других данных объекта.
A(const A& rhs) : data_(rhs.data_) {}
Например:
A aa;
A a = aa; //copy constructor
Оператор присваивания используется для замены данных ранее инициализированного объекта некоторыми другими данными объекта.
A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}
Например:
A aa;
A a;
a = aa; // assignment operator
Вы можете заменить конструкцию копирования конструкцией по умолчанию плюс присвоение, но это будет менее эффективно.
(В качестве примечания: мои реализации, приведенные выше, являются именно теми, которые компилятор предоставляет вам бесплатно, поэтому не имеет особого смысла реализовывать их вручную. Если у вас есть одна из этих двух, вполне вероятно, что вы управляете каким-то ресурсом вручную. В этом случае, согласно правилу трех, вам, скорее всего, понадобится еще один плюс деструктор.)
Ответ 2
Разница между конструктором копирования и оператором присваивания вызывает много путаницы для новых программистов, но на самом деле это не так сложно. Подведение итогов:
- Если новый объект должен быть создан до того, как произойдет копирование, используется конструктор копирования.
- Если новый объект не нужно создавать до того, как произойдет копирование, используется оператор присваивания.
Пример для оператора присваивания:
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
Ответ 3
Первая - это инициализация копирования, вторая - просто назначение. Нет такой вещи, как конструктор присваивания.
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;}
};
Я также рекомендую вам взглянуть на:
Почему вместо конструктора преобразования вызывается конструктор конструктора?
Что такое правило трех?
Ответ 4
разница между конструктором копирования и конструктором присваивания составляет:
- В случае конструктора копирования он создает новый объект. (
<classname> <o1>=<o2>
)
- В случае конструктора присваивания он не будет создавать никаких объектов, это означает, что они применяются к уже созданным объектам (
<o1>=<o2>
).
И основные функции в обоих случаях одинаковы, они будут копировать данные из o2 в o1 по каждому члену.
Ответ 5
То, что @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
}
OUTPUT
конструктор по умолчанию
конструктор копирования
конструктор по умолчанию
оператор присваивания
Ответ 6
Простыми словами,
Конструктор копирования вызывается, когда новый объект создается из существующего объекта как копия существующего объекта.
И оператор присваивания вызывается, когда уже инициализированному объекту присваивается новое значение из другого существующего объекта.
Пример -
t2 = t1; // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"
Ответ 7
Я хочу добавить еще одно замечание по этой теме.
"Операторная функция оператора присваивания должна быть записана только как функция-член класса". Мы не можем сделать это как функцию друга, в отличие от другого двоичного или унарного оператора.
Ответ 8
Что-то добавить о конструкторе копирования:
-
При передаче объекта по значению он будет использовать конструктор копирования
-
Когда объект возвращается из функции по значению, он будет использовать конструктор копирования
-
При инициализации объекта с использованием значений другого объекта (в качестве примера вы даете).