Я не понимаю разницы между конструктором присваивания и конструктором копирования в 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?
Я хочу знать, как выделить память для конструктора присваивания и конструктора копирования?
Ответы:
Конструктор копирования используется для инициализации ранее неинициализированный объект из данных какого - то другого объекта.
Например:
Оператор присваивания используется для замены данных в ранее инициализирован объект с данными какого - то другого объекта.
Например:
Вы можете заменить построение копии построением по умолчанию плюс присваивание, но это будет менее эффективно.
(В качестве примечания: мои реализации выше - это именно те, которые компилятор предоставляет вам бесплатно, поэтому не имеет смысла реализовывать их вручную. Если у вас есть один из этих двух, вероятно, вы вручную управляете каким-то ресурсом. В этом случае, согласно Правилу трех , вам, скорее всего, также понадобится второй плюс деструктор.)
источник
=default;
.= default
их использовать там, где требуется ctor по умолчанию: простая реализация пустого тела самостоятельно по-прежнему считается определяемым пользователем ctor и, таким образом (на стандартном уровне ) нетривиален и исключает тип из классификаций, требующих тривиального ctor.:)
Попробуете еще раз объяснить, о чем говорите?Разница между конструктором копирования и оператором присваивания вызывает большое недоумение у начинающих программистов, но на самом деле это не так уж и сложно. Резюмируя:
Пример оператора присваивания:
Пример конструктора копирования:
источник
vector <A> v3
а затемv3 = v2
(гдеv2
ранее объявленные и содержащие элементыvector<A>
) вызывает мой явныйA
конструктор копирования вместоoperator=
? Я ожидал , чтоoperator=
будет называться вместоcopy constructor
потому , что мойv3
объект уже был объявлен в то время , когда я сделал назначениеПервый - инициализация копии, второй - просто присваивание. Конструктора присваивания не существует.
использует созданный компилятором конструктор копирования.
для построения использует конструктор по умолчанию
cc
, а затем * оператор присваивания ** (operator =
) для уже существующего объекта.IDK, что вы имеете в виду под выделением памяти в этом случае, но если вы хотите увидеть, что происходит, вы можете:
Также рекомендую вам взглянуть на:
Почему вызывается конструктор копирования вместо конструктора преобразования?
Что такое правило трех?
источник
Проще говоря,
Конструктор копирования вызывается, когда новый объект создается из существующего объекта, как копия существующего объекта. И оператор присваивания вызывается, когда уже инициализированному объекту присваивается новое значение из другого существующего объекта.
Пример-
источник
Что @Luchian Grigore Said реализовано вот так
ВЫВОД
конструктор по умолчанию
конструктор копирования
конструктор по умолчанию
оператор присваивания
источник
разница между конструктором копирования и конструктором присваивания:
<classname> <o1>=<o2>
)<o1>=<o2>
).И основные функции в обоих одинаковы, они будут копировать данные из o2 в o1 поэтапно.
источник
Хочу добавить еще один момент по этой теме. «Операторная функция оператора присваивания должна быть написана только как функция-член класса». Мы не можем сделать это функцией друга, в отличие от других бинарных или унарных операторов.
источник
Кое-что добавить о конструкторе копирования:
При передаче объекта по значению он будет использовать конструктор копирования
Когда объект возвращается из функции по значению, он будет использовать конструктор копирования
При инициализации объекта с использованием значений другого объекта (как в приведенном вами примере).
источник