Overloading is thankfully easier than understanding blocks of memory and pointers. 
Consider this scenario:
You have a class that represents a vector, and you need to come up with a way to add them together using the "+" operator. You'd normally store a vector as an array of numbers, but if you try to add two arrays together, you'd get a compile-time error:
PHP Code:
int arr1[3] = { 1, 2, 3 };
int arr2[3] = { 4, 5, 6 };
cout << arr1 + arr2; // Bad
However, we can overload the + operator to execute code that actually add the two vectors together:
PHP Code:
// Note: Calling the class "Vect" since there are already Vector libraries for C++ called "Vector" :p
class Vect
{
int vector[]; // This array will hold the values in the vector
int size;
Vect::Vect(int numElements, int *values) // Constructor to assign vector values
{
vector = values;
size = numElements;
}
Vect Vect::operator+ (Vect vector1, Vect vector2) // Overloaded + operator
{
Vect added(vector1.size); // Creates a new vector to contain added values
for (int i = 0; i < vector1.size && i < vector2.size; i++) {
added[i] = vector1[i] + vector2[i];
}
return added;
}
}
// Then we can call this code:
Vect arr1(3, {1, 2, 3});
Vect arr2(3, { 4, 5, 6 });
cout << arr1 + arr2; // Good
In plain English, overloading operators allow to to make two objects do whatever you like when you use some operator on them, e.g. obj1 + obj2; obj1 * obj2, etc.
P.S. I haven't tested that code or anything, so don't expect it to work first time (there's bound to be something funky going on with pointers and references there).