The overloaded = operator will copy the data from instance_2 to instance_1, so the operator function will be called in instance_1 with instance_2 as its arg. If my analogy is correct this far, the question is why does it return *this. I've seen multiple snippets of code do the same and I don't understand the reason for the return value, can't it just be voided?
For example, make your assignment operator void, create three instances then assign the last to the other two in a one-liner. It fails: https://ideone.com/bCizR4
Returning a reference to your object allows this to happen. Same code with reference returned (and an obligatory self-assignment check!) : https://ideone.com/z1ZELL