Let me break this for you:
a) lastHeartPositionX is the left side of the first heart (because that's where the Origin is). It's value right now is 16.
b) heart.Width is how much to the left we want to put our new heart. Without this, we'd have our new heart above the old one. My heart sprite is 32x32, so this value is 32.
c) 2 is just to make the new heart a little more away from the first one. You can put some bigger number, but this works just fine for now.
IMPORTANT AND CRUCIAL STUFF!!!
After that, notice that we set lastHeartPositionX to heart.X, and I can see you asking why. If you think this will get the X position for the very first heart (or any other), you are VERY wrong.
Since we created a heart in the line above this one, we are referencing that particular instance. That means we are setting, well, the X position of the last heart to the lastHeartPositionX variable.
See? Pretty easy, huh?
I know, loops can be confusing, but when you get the hang of it, they are really useful!
If you did everything right, you should have something like this: