Assignment operator is a field-by-field and bitwise overwrite  without eating up new memory. Both LHS and RHS must be (preexisting) objects with addresses.
A constructor always eats up (heap or stack) new memory, and reduces free memory.
 If a field is a pointer, then the same address is put into the LHS’s field bitwise. LHS and RHS both point to the same address — shallow copy.
Q: what if a field is a reference?
A: Can’t reassign. Default op= will trigger an error (compile time or runtime).
A: reference field is rare.