Um construtor de cópia é usado para inicializar um objeto não inicializado anteriormente a partir dos dados de algum outro objeto.
A(const A& rhs) : data_(rhs.data_) {}
Por exemplo:
A aa;
A a = aa; //copy constructor
Um operador de atribuição é usado para substituir os dados de um objeto inicializado anteriormente pelos dados de algum outro objeto.
A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}
Por exemplo:
A aa;
A a;
a = aa; // assignment operator
Você poderia substituir a construção de cópia por construção padrão mais atribuição, mas isso seria menos eficiente.
(Como uma observação lateral: Minhas implementações acima são exatamente as que o compilador concede a você gratuitamente, então não faria muito sentido implementá-las manualmente. Se você tiver uma dessas duas, é provável que esteja gerenciando algum recurso manualmente. Nesse caso, de acordo com a Regra de Três , você provavelmente também precisará do outro mais um destruidor.)