Конструктор копирования используется для инициализации ранее неинициализированный объект из данных какого - то другого объекта.
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
Вы можете заменить построение копии построением по умолчанию плюс присваивание, но это будет менее эффективно.
(В качестве примечания: мои реализации выше - это именно те, которые компилятор предоставляет вам бесплатно, поэтому не имеет смысла реализовывать их вручную. Если у вас есть один из этих двух, вероятно, вы вручную управляете каким-то ресурсом. В этом случае, согласно Правилу трех , вам, скорее всего, также понадобится второй плюс деструктор.)