En principio, la importancia de sobrecargar el operador de asignación o de realizar un constructor de copia en una clase viene por lo siguiente:
(Dependiendo del compilador, pero en principio)
Si no están definidos, se copia campo a campo.
Problema? Si tienes memoria dinámica, y copias campo a campo, tienes dos punteros apuntando al mismo sitio. La copia es borrada (por ejemplo, pasabas por copia en una función) y con ello se libera la memoria dinámica a la cual apuntaba. Ahora, el original tiene un campo que apunta a un espacio liberado, mala suerte, violación de segmento cuando accedas y fin del programa.
Solución? constructores de copia y sobrecarga de operadores de asignación, para en caso que tu clase trabaje con memoria dinámica, replicar dicha memoria de forma manual, y no copiando el puntero. (por ejemplo, volviendo a declarar un vector y copiando todos los elementos manualmente, en vez que el compilador simplemente te copie el puntero).