En este tutorial, aprenderemos sobre la sobrecarga de operadores con la ayuda de ejemplos.
En C ++, podemos cambiar la forma en que los operadores trabajan para tipos definidos por el usuario como objetos y estructuras. Esto se conoce como sobrecarga del operador . Por ejemplo,
Supongamos que hemos creado tres objetos c1, c2 y el resultado de una clase llamada Complex
que representa números complejos.
Dado que la sobrecarga de operadores nos permite cambiar cómo funcionan los operadores, podemos redefinir cómo funciona el +
operador y usarlo para sumar los números complejos de c1 y c2 escribiendo el siguiente código:
result = c1 + c2;
en lugar de algo como
result = c1.addNumbers(c2);
Esto hace que nuestro código sea intuitivo y fácil de entender.
Nota: No podemos utilizar la sobrecarga de operadores para tipos de datos fundamentales como int
, float
, char
y así sucesivamente.
Sintaxis para la sobrecarga del operador C ++
Para sobrecargar a un operador, usamos una operator
función especial .
class className (… public returnType operator symbol (arguments) (… )… );
Aquí,
returnType
es el tipo de retorno de la función.- operador es una palabra clave.
symbol
es el operador que queremos sobrecargar. Como:+
,<
,-
,++
, etc.arguments
son los argumentos pasados a la función.
Sobrecarga de operadores en operadores unarios
Los operadores unarios operan en un solo operando. El operador de incremento ++
y el operador de decremento --
son ejemplos de operadores unarios.
Ejemplo 1: Sobrecarga del operador ++ (operador unario)
// Overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ ()" function ++count1; count1.display(); return 0; )
Salida
Cuenta: 6
Aquí, cuando usamos ++count1;
, void operator ++ ()
se llama. Esto aumenta el atributo de valor para el objeto count1 en 1.
Nota: Cuando sobrecargamos operadores, podemos usarlo para que funcione como queramos. Por ejemplo, podríamos haber utilizado ++
para aumentar el valor en 100.
Sin embargo, esto hace que nuestro código sea confuso y difícil de entender. Nuestro trabajo como programador es utilizar la sobrecarga del operador de manera adecuada y de manera coherente e intuitiva.
El ejemplo anterior funciona solo cuando ++
se usa como prefijo. Para que ++
funcione como sufijo utilizamos esta sintaxis.
void operator ++ (int) ( // code )
Observe el int
interior de los paréntesis. Es la sintaxis usada para usar operadores unarios como sufijo; no es un parámetro de función.
Ejemplo 2: Sobrecarga del operador ++ (operador unario)
// Overload ++ when used as prefix and postfix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) // Overload ++ when used as postfix void operator ++ (int) ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ (int)" function count1++; count1.display(); // Call the "void operator ++ ()" function ++ count1; count1.display(); return 0; )
Salida
Cuenta: 6 Cuenta: 7
El Ejemplo 2 funciona cuando ++
se usa como prefijo y sufijo. Sin embargo, no funciona si intentamos hacer algo como esto:
Count count1, result; // Error result = ++count1;
Esto se debe a que el tipo de retorno de nuestra función de operador es void
. Podemos resolver este problema haciendo Count
como tipo de retorno de la función del operador.
// return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )
Ejemplo 3: Valor de retorno de la función de operador (Operador ++)
#include using namespace std; class Count ( private: int value; public : // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) // Overload ++ when used as postfix Count operator ++ (int) ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1, result; // Call the "Count operator ++ ()" function result = ++count1; result.display(); // Call the "Count operator ++ (int)" function result = count1++; result.display(); return 0; )
Salida
Cuenta: 6 Cuenta: 7
Aquí, hemos utilizado el siguiente código para la sobrecarga del operador de prefijo:
// Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )
El código para la sobrecarga del operador postfix es el mismo también. Observe que hemos creado un objeto temp y devuelto su valor a la función del operador.
También observe el código
temp.value = ++value;
El valor de la variable pertenece al objeto count1 en main()
porque count1 está llamando a la función, mientras que temp.value pertenece al objeto temp.
Sobrecarga de operadores en operadores binarios
Los operadores binarios trabajan con dos operandos. Por ejemplo,
result = num + 9;
Aquí, +
hay un operador binario que trabaja con los operandos num y 9
.
Cuando sobrecargamos el operador binario para tipos definidos por el usuario usando el código:
obj3 = obj1 + obj2;
Se llama a la función del operador usando el objeto obj1 y obj2 se pasa como argumento a la función.
Ejemplo 4: Sobrecarga del operador binario de C ++
// C++ program to overload the binary operator + // This program adds two complex numbers #include using namespace std; class Complex ( private: float real; float imag; public: // Constructor to initialize real and imag to 0 Complex() : real(0), imag(0) () void input() ( cout <> real; cin>> imag; ) // Overload the + operator Complex operator + (const Complex& obj) ( Complex temp; temp.real = real + obj.real; temp.imag = imag + obj.imag; return temp; ) void output() ( if (imag < 0) cout << "Output Complex number: " << real << imag << "i"; else cout << "Output Complex number: " << real << "+" << imag << "i"; ) ); int main() ( Complex complex1, complex2, result; cout << "Enter first complex number:"; complex1.input(); cout << "Enter second complex number:"; complex2.input(); // complex1 calls the operator function // complex2 is passed as an argument to the function result = complex1 + complex2; result.output(); return 0; )
Salida
Ingrese el primer número complejo: Ingrese partes reales e imaginarias respectivamente: 9 5 Ingrese el segundo número complejo: Ingrese partes reales e imaginarias respectivamente: 7 6 Salida Número complejo: 16 + 11i
En este programa, la función del operador es:
Complex operator + (const Complex& obj) ( // code )
En lugar de esto, también podríamos haber escrito esta función como:
Complex operator + (Complex obj) ( // code )
Sin embargo,
- el uso
&
hace que nuestro código sea eficiente al hacer referencia al objeto complex2 en lugar de hacer un objeto duplicado dentro de la función del operador. - el uso
const
se considera una buena práctica porque evita que la función del operador modifique complex2.

Cosas para recordar en la sobrecarga de operadores de C ++
- Dos operadores
=
y&
ya están sobrecargados por defecto en C ++. Por ejemplo, para copiar objetos de la misma clase, podemos usar directamente el=
operador. No necesitamos crear una función de operador. - La sobrecarga de operadores no puede cambiar la precedencia y la asociatividad de los operadores. Sin embargo, si queremos cambiar el orden de evaluación, conviene utilizar paréntesis.
- Hay 4 operadores que no se pueden sobrecargar en C ++. Son:
::
(resolución de alcance).
(selección de miembros).*
(selección de miembros a través del puntero a la función)?:
(operador ternario)
Visite estas páginas para obtener más información sobre:
- ¿Cómo sobrecargar al operador de incremento de manera correcta?
- ¿Cómo sobrecargar el operador binario para restar números complejos?