Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Sobrecarga de Operadores | Visión General del Polimorfismo
POO en C++
course content

Contenido del Curso

POO en C++

POO en C++

1. Fundamentos de la POO en C++
2. Constructores y Destructores
3. Visión General de la Encapsulación
4. Visión General de la Herencia
5. Visión General del Polimorfismo

book
Sobrecarga de Operadores

La sobrecarga de operadores es una característica poderosa en los lenguajes de programación orientados a objetos que permite redefinir el comportamiento de los operadores para las classes definidas por el usuario. Al sobrecargar operadores, puedes proporcionar implementaciones personalizadas para operaciones que involucren objetos de tu class, permitiendo un código más intuitivo y expresivo.

Sintaxis de la sobrecarga de operadores

La sobrecarga se logra definiendo funciones miembro especiales o funciones amigas que implementan el comportamiento deseado para el operador. La sintaxis para sobrecargar operadores varía dependiendo del operador que se desea sobrecargar. La forma general es la siguiente:

overloading.h

overloading.h

copy
1
return_type operator operator_symbol(parameters);

La sintaxis, o más específicamente, la cantidad de parámetros y el tipo de retorno, también depende de si se están sobrecargando los operadores como funciones miembro o como funciones amigas.

Member.h

Member.h

Friend.h

Friend.h

copy
123456
class Example { public: Example operator+ (const Example& other) { // Define behavior for operator+ } };

Tabla de operadores que se pueden sobrecargar

A continuación se muestra una tabla con todos los operadores que se pueden sobrecargar. Sin embargo, es importante destacar que, aunque es posible sobrecargar estos operadores, no es en absoluto necesario sobrecargar todos ellos para tus classes.

Sobrecarga de operadores de inserción de flujo

Para sobrecargar los operadores << y >> para una class, normalmente se define una función amiga o una función miembro que toma un flujo de salida (std::ostream&) o flujo de entrada (std::istream&) como el operando izquierdo y un objeto de su class como el operando derecho. Esta función luego formatea los datos del objeto y los transmite hacia o desde el flujo.

Point.h

Point.h

copy
123456789101112131415
class Point { public: friend std::ostream& operator<<(std::ostream& out, const Point& point); friend std::istream& operator>>(std::istream& in, Point& point); private: int x, y; }; std::ostream& operator<<(std::ostream& out, const Point& point) { return out << "x: " << point.x << ", y: " << point.y << std::endl; } std::istream& operator>>(std::istream& in, Point& point) { return in >> point.x >> point.y; }

La sobrecarga de operadores de inserción de flujo, como <<, permite definir un comportamiento de salida personalizado para objetos de sus classes cuando se transmiten a un flujo de salida como std::cout. Esta característica es especialmente útil para mejorar la legibilidad y usabilidad de su código al trabajar con tipos de datos personalizados.

Note
Nota

La sobrecarga del operador << para flujo de salida es más común que la sobrecarga del operador >> para flujo de entrada, porque las operaciones de entrada con >> pueden ser más propensas a errores.

Sobrecarga de operadores aritméticos

Es posible sobrecargar otros operadores aritméticos (-, *, /, %) de manera similar para realizar operaciones personalizadas con los tipos definidos por el usuario.

main.cpp

main.cpp

copy
12345678910111213141516171819202122
#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} Point operator+(const Point& other) { return Point(x + other.x, y + other.y); } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p = Point(2, 4) + Point(2, 6); std::cout << p.getX() << ' ' << p.getY() << std::endl; }

El operador se sobrecarga como una función miembro de la Point class. Toma otro objeto Point como parámetro y devuelve un nuevo objeto Point que representa la suma de los dos puntos. El operador + puede ser reemplazado por -, *, / o %, realizando los ajustes correspondientes en la lógica de implementación.

Incremento y decremento

Tanto los operadores de incremento y decremento en prefijo y sufijo (++ y --) pueden ser sobrecargados para classes personalizadas. Comencemos con la versión prefijo:

main.cpp

main.cpp

copy
123456789101112131415161718192021222324
#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} // Prefix increment operator (++point) Point& operator++() { ++x; ++y; return *this; } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p(2, 2); ++p; std::cout << p.getX() << ' ' << p.getY() << std::endl; }
Note
Nota

El operador de decremento se sobrecarga de manera similar al operador de incremento, utilizando el operador -- y la operación de resta.

Como puedes observar, la sobrecarga de los operadores de incremento y decremento prefijos es sencilla. Sin embargo, se vuelve más compleja con las versiones postfijas. Recuerda que existe una diferencia en el orden de ejecución entre las operaciones prefijas y postfijas.

Al sobrecargar el incremento y decremento postfijo también se debe implementar la característica del orden de ejecución. Se verá de la siguiente manera:

main.cpp

main.cpp

copy
1234567891011121314151617181920212223242526
#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} // Postfix increment operator (point++) Point operator++(int) { Point temp = *this; // Creating a temp variable ++(this->x); // Incrementing original Point's x ++(this->y); // Incrementing original Point's y return temp; // Returning created temp variable } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p(2, 2); p++; std::cout << p.getX() << ' ' << p.getY() << std::endl; }
Note
Nota

El parámetro entero se pasa sin nombre solo para indicar al compilador que se está sobrecargando el operador de incremento posfijo. Esto es necesario porque las declaraciones para los operadores prefijo y posfijo son, de otro modo, idénticas.

En la implementación del operador de incremento posfijo, el valor original del objeto se almacena en una variable temporal (temp). Luego, el objeto actual se incrementa, pero el operador retorna el valor almacenado en temp. Esto significa que la variable se incrementa, pero el cambio solo surte efecto en la siguiente expresión, ya que el operador devuelve el valor original.

question mark

¿Qué significa la sobrecarga de operadores?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 4

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

course content

Contenido del Curso

POO en C++

POO en C++

1. Fundamentos de la POO en C++
2. Constructores y Destructores
3. Visión General de la Encapsulación
4. Visión General de la Herencia
5. Visión General del Polimorfismo

book
Sobrecarga de Operadores

La sobrecarga de operadores es una característica poderosa en los lenguajes de programación orientados a objetos que permite redefinir el comportamiento de los operadores para las classes definidas por el usuario. Al sobrecargar operadores, puedes proporcionar implementaciones personalizadas para operaciones que involucren objetos de tu class, permitiendo un código más intuitivo y expresivo.

Sintaxis de la sobrecarga de operadores

La sobrecarga se logra definiendo funciones miembro especiales o funciones amigas que implementan el comportamiento deseado para el operador. La sintaxis para sobrecargar operadores varía dependiendo del operador que se desea sobrecargar. La forma general es la siguiente:

overloading.h

overloading.h

copy
1
return_type operator operator_symbol(parameters);

La sintaxis, o más específicamente, la cantidad de parámetros y el tipo de retorno, también depende de si se están sobrecargando los operadores como funciones miembro o como funciones amigas.

Member.h

Member.h

Friend.h

Friend.h

copy
123456
class Example { public: Example operator+ (const Example& other) { // Define behavior for operator+ } };

Tabla de operadores que se pueden sobrecargar

A continuación se muestra una tabla con todos los operadores que se pueden sobrecargar. Sin embargo, es importante destacar que, aunque es posible sobrecargar estos operadores, no es en absoluto necesario sobrecargar todos ellos para tus classes.

Sobrecarga de operadores de inserción de flujo

Para sobrecargar los operadores << y >> para una class, normalmente se define una función amiga o una función miembro que toma un flujo de salida (std::ostream&) o flujo de entrada (std::istream&) como el operando izquierdo y un objeto de su class como el operando derecho. Esta función luego formatea los datos del objeto y los transmite hacia o desde el flujo.

Point.h

Point.h

copy
123456789101112131415
class Point { public: friend std::ostream& operator<<(std::ostream& out, const Point& point); friend std::istream& operator>>(std::istream& in, Point& point); private: int x, y; }; std::ostream& operator<<(std::ostream& out, const Point& point) { return out << "x: " << point.x << ", y: " << point.y << std::endl; } std::istream& operator>>(std::istream& in, Point& point) { return in >> point.x >> point.y; }

La sobrecarga de operadores de inserción de flujo, como <<, permite definir un comportamiento de salida personalizado para objetos de sus classes cuando se transmiten a un flujo de salida como std::cout. Esta característica es especialmente útil para mejorar la legibilidad y usabilidad de su código al trabajar con tipos de datos personalizados.

Note
Nota

La sobrecarga del operador << para flujo de salida es más común que la sobrecarga del operador >> para flujo de entrada, porque las operaciones de entrada con >> pueden ser más propensas a errores.

Sobrecarga de operadores aritméticos

Es posible sobrecargar otros operadores aritméticos (-, *, /, %) de manera similar para realizar operaciones personalizadas con los tipos definidos por el usuario.

main.cpp

main.cpp

copy
12345678910111213141516171819202122
#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} Point operator+(const Point& other) { return Point(x + other.x, y + other.y); } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p = Point(2, 4) + Point(2, 6); std::cout << p.getX() << ' ' << p.getY() << std::endl; }

El operador se sobrecarga como una función miembro de la Point class. Toma otro objeto Point como parámetro y devuelve un nuevo objeto Point que representa la suma de los dos puntos. El operador + puede ser reemplazado por -, *, / o %, realizando los ajustes correspondientes en la lógica de implementación.

Incremento y decremento

Tanto los operadores de incremento y decremento en prefijo y sufijo (++ y --) pueden ser sobrecargados para classes personalizadas. Comencemos con la versión prefijo:

main.cpp

main.cpp

copy
123456789101112131415161718192021222324
#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} // Prefix increment operator (++point) Point& operator++() { ++x; ++y; return *this; } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p(2, 2); ++p; std::cout << p.getX() << ' ' << p.getY() << std::endl; }
Note
Nota

El operador de decremento se sobrecarga de manera similar al operador de incremento, utilizando el operador -- y la operación de resta.

Como puedes observar, la sobrecarga de los operadores de incremento y decremento prefijos es sencilla. Sin embargo, se vuelve más compleja con las versiones postfijas. Recuerda que existe una diferencia en el orden de ejecución entre las operaciones prefijas y postfijas.

Al sobrecargar el incremento y decremento postfijo también se debe implementar la característica del orden de ejecución. Se verá de la siguiente manera:

main.cpp

main.cpp

copy
1234567891011121314151617181920212223242526
#include <iostream> class Point { public: Point(int xCoord, int yCoord) : x(xCoord), y(yCoord) {} // Postfix increment operator (point++) Point operator++(int) { Point temp = *this; // Creating a temp variable ++(this->x); // Incrementing original Point's x ++(this->y); // Incrementing original Point's y return temp; // Returning created temp variable } int getX() { return x; } int getY() { return y; } private: int x, y; }; int main() { Point p(2, 2); p++; std::cout << p.getX() << ' ' << p.getY() << std::endl; }
Note
Nota

El parámetro entero se pasa sin nombre solo para indicar al compilador que se está sobrecargando el operador de incremento posfijo. Esto es necesario porque las declaraciones para los operadores prefijo y posfijo son, de otro modo, idénticas.

En la implementación del operador de incremento posfijo, el valor original del objeto se almacena en una variable temporal (temp). Luego, el objeto actual se incrementa, pero el operador retorna el valor almacenado en temp. Esto significa que la variable se incrementa, pero el cambio solo surte efecto en la siguiente expresión, ya que el operador devuelve el valor original.

question mark

¿Qué significa la sobrecarga de operadores?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 4
some-alt