I'm not familiar with Matlab, but from memory, it's a scripting language designed to make it easy to perform complex maths operations. I presume that there's built-in memory management, such that if you simply change the size of a matrix, it automatically allocates more memory for you.
C++ is different. It's sophisticated and powerful, and one of the aspects of it that makes it sophisticated and powerful is that the memory management is entirely in the hands of the developer. However, this means that if you start treating an object as if it was bigger than the memory you originally allocated for it, it won't automatically increase the size of that memory.
You have to handle that yourself.
I understood exactly what you are doing with that pointer arithmetic, and it would be correct if you already had that extra memory allocated to store the extra row. If you're changing the size of your matrix by adding another row to it, then you'll need to dynamically allocate new memory for it.
Of course, that pointer arithmetic won't work at all when it comes to adding a new column - but that's a whole separate issue.
Whatever tutorial source you're using to learn C++ will, no doubt, have a section on dynamic memory allocation. There's also a brief tutorial on this very site:
http://www.cplusplus.com/doc/tutorial/dynamic/
Edit: Regarding your first point, it's perfectly possible to return a single object, such as a MatrixClass object, from a function. However it's not necessarily the best thing to do. If your function is going to reallocate the memory for the matrix, then returning a pointer is probably the correct thing to do.