Sobre carga de operadores en C++

Cuando escribimos una sentencia como:

          int a = 25;
          int b = 23;
          int c = 0;
          . . . . .

         c = a + b;

El compilador sabe que es un tipo int y como operar con él. Pero cuando creamos un tipo propio, por ejemplo la clase Punto

//Definición de la clase Punto

class Punto
{
private:        //Miembros privados de la clase
      int _x;
      int _y;

public:         //Miembros públicos de la clase
      void SetX(const int valor);
      void SetY(const int valor);
      int GetX(void);
      int GetY(void);
};

y pretendemos hacer esto:

         Punto a;
         Punto b;
         Punto c;

         . . . . .

         c = a + b;

El compilador no tiene ni idea de como debe hacer la suma ni la asignación. Para solucionar esto, C++ nos permite sobrecargar el operador +.

Un operador sobrecargado es una función que recibe un argumento de la misma clase y devuelve un objeto de la misma clase.
Para sobrecargar un operador, se antecede la palabra operator al operador y entre paréntesis, como cualquier otra función, la lista de parámetros.

Para sobrecargar el operador + de la clase Punto escribiríamos:

class Punto
{
private:        //Miembros privados de la clase
      int _x;
      int _y;

public:         //Miembros públicos de la clase
      Punto operator+(Punto);   //operador de suma sobrecargado

. . . . .


Punto Punto::operator+(Punto a)
{
      Punto aux;
      aux._x = _x + a.GetX();
      aux._y = _y + a.GetY();

      return aux;
}

Con esta modificación en el código de la clase Punto, ya podríamos escribir sumas de esta forma:

         Punto a;
         Punto b;
         Punto c;

         . . . . .

         c = a + b;   

C++ nos permite sobrecargar lo siguientes operadores:

+
-
*
/
^
&
|
+=
-=
*=
/=
^=
&=
|=
~
!
=
<
>
<<
>>
>>=
<<=
==
!=
<=
>=
&&
||
++--->*,->[]
()
new
delete
new[]
delete[]