Yes. Otherwise the changes aren't reflected back in the calling function. For Pass by value (if a ref isn't used) the param variables are effectively local with initial values obtained from the calling function.
it is necessary to ensure the values are modified. You can do that with pointers instead, but that is ugly and usually best avoided. You can also craft an inline swap (like a macro, also a bad idea) that does it directly. Basically, there are alternatives, but nothing any better and most notably worse.
If you did not know, c++ has a swap function already, which is the right way to do it if not studying swap logic or forced to DIY in schoolwork.
Without reference (or pointer) parameters swapping the two numbers in the function will have no effect because you are copying the numbers when passed to the function.
a pointer is a lot like a reference, but a pointer is NOT a reference. The idea is the same, and in some cases the generated machine language may be the same, but even so it is not safe to say they are the same things. So, 'almost' but 'no, not really'.