C++'s reference '&' and C#'s ref are quite different.
The normal object passing of parameters in C# (ie. no 'ref' or 'out') is the equivalent of C++'s 'reference' passing. The callee gets a handle to the object and modifying fields on the object does modify the object originally passed by the caller. In C++ if you pass a normal object (no reference) the callee gets a copy of the object and modifying its fields does not affect the original object in the caller context. In C# if the callee assigns a new object to the argument then it will now operate on the new object, but the caller will not see this change, as the caller will still reference the old object in its context.
The 'ref' in C# means that the callee can actually change the handle it has received. So if he assign the handle to a new object, this change is visible in the caller context, the argument passed to the call will now 'point' to the new object. This is the equivalent of C++'s passing a reference to a pointer, so that the callee can change the address the pointer is pointing to. C#'s 'out' is just 'ref' with some semantic sugar around initialization, so all above applies to 'out'.
All this applies of course to how C# manipulate object parameters, not 'value types' (eg. ints).