Diferencia entre revisiones de «Sobrecarga de operadores binarios (Programación)»

m (Texto reemplazado: «<div align="justify">» por «»)
 
(No se muestran 6 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
<div align="justify">{{Definición|Nombre= Sobrecarga de operadores binarios |imagen= |concepto=Se llama sobrecarga de operadores cuando reutilizando el mismo operador con un número de usos diferentes, y el compilador decide como usar ese operador dependiendo sobre qué opera.}}  
+
{{Definición|Nombre= Sobrecarga de operadores binarios |imagen= |concepto=Se llama sobrecarga de operadores cuando reutilizando el mismo operador con un número de usos diferentes, y el compilador decide como usar ese operador dependiendo sobre qué opera.}}  
 
 
 
'''Sobrecarga de operadores binarios (Programación)'''. Pueden ser sobrecargados de dos formas:
 
'''Sobrecarga de operadores binarios (Programación)'''. Pueden ser sobrecargados de dos formas:
 
+
# Declarando una [[Función (programación)|función]] miembro no estática que acepte un argumento
# Declarando una función miembro no estática que acepte un argumento
 
 
# Declarando una función no miembro (generalmente friend) que acepte dos argumentos.
 
# Declarando una función no miembro (generalmente friend) que acepte dos argumentos.
 
 
Dependiendo de la declaración, si @ representa el operador binario, la expresión x @ y  entre miembros de una clase C puede ser interpretada como cualquiera de las dos formas:
 
Dependiendo de la declaración, si @ representa el operador binario, la expresión x @ y  entre miembros de una clase C puede ser interpretada como cualquiera de las dos formas:
 
 
# x.operator@(y)
 
# x.operator@(y)
 
# operator@(x, y)
 
# operator@(x, y)
 
 
Si han sido declaradas ambas formas, se aplica la congruencia estándar de argumentos para resolver cualquier posible ambigüedad.
 
Si han sido declaradas ambas formas, se aplica la congruencia estándar de argumentos para resolver cualquier posible ambigüedad.
 
==  Sobrecarga del operador suma ( + )==
 
==  Sobrecarga del operador suma ( + )==
Línea 25: Línea 20:
 
   }
 
   }
 
  };
 
  };
 
 
  int main () {    // =========
 
  int main () {    // =========
 
   float x = 5, y = 6;
 
   float x = 5, y = 6;
Línea 57: Línea 51:
 
*[[Operadores|Operadores]]
 
*[[Operadores|Operadores]]
 
*[[Sobrecarga de operadores| Sobrecarga de operadores]]
 
*[[Sobrecarga de operadores| Sobrecarga de operadores]]
*[[Sobrecarga de operadores unarios| Sobrecarga de operadores unarios]]
+
*[[Sobrecarga de operadores unarios (Programación)| Sobrecarga de operadores unarios (Programación)]]
 +
*[[Sobrecarga de operadores lógicos (Programación)| Sobrecarga de operadores lógicos (Programación)]]
 +
*[[Sobrecarga del operador subíndice (Programación)| Sobrecarga del operador subíndice (Programación)]]
 +
*[[Sobrecarga del operador selector indirecto de miembro (Programación)| Sobrecarga del operador selector indirecto de miembro (Programación)]]
 
== Fuente ==
 
== Fuente ==
* [http://www.zator.com/Cpp/E4_9_18b.htm Sobrecarga de operadores binarios]
+
 
 
* [http://www.gratismil.com/apuntes/lenguaje-c/90-sobrecarga-de-operadores.htm Sobrecarga de operadores en c]
 
* [http://www.gratismil.com/apuntes/lenguaje-c/90-sobrecarga-de-operadores.htm Sobrecarga de operadores en c]
 
*[http://www.chuidiang.com/clinux/sobrecarga/sobrecarga.php Sobrecarga de operadores en C++]
 
*[http://www.chuidiang.com/clinux/sobrecarga/sobrecarga.php Sobrecarga de operadores en C++]
 
[[Category:Informática]] [[Category:Lenguajes_de_programación]] [[Category:Programación]]
 
[[Category:Informática]] [[Category:Lenguajes_de_programación]] [[Category:Programación]]

última versión al 09:10 13 jul 2019

Sobrecarga de operadores binarios (Programación)
Información sobre la plantilla
Concepto:Se llama sobrecarga de operadores cuando reutilizando el mismo operador con un número de usos diferentes, y el compilador decide como usar ese operador dependiendo sobre qué opera.

Sobrecarga de operadores binarios (Programación). Pueden ser sobrecargados de dos formas:

  1. Declarando una función miembro no estática que acepte un argumento
  2. Declarando una función no miembro (generalmente friend) que acepte dos argumentos.

Dependiendo de la declaración, si @ representa el operador binario, la expresión x @ y entre miembros de una clase C puede ser interpretada como cualquiera de las dos formas:

  1. x.operator@(y)
  2. operator@(x, y)

Si han sido declaradas ambas formas, se aplica la congruencia estándar de argumentos para resolver cualquier posible ambigüedad.

Sobrecarga del operador suma ( + )

En el ejemplo que sigue se utiliza la clase Vector, y sobrecargamos el operador suma binaria (+), de forma que pueda ser utilizada con tipos de dicha clase.

#include <iostream>
using namespace std;
class Vector {
 public:
 float x, y;
 Vector operator+ (Vector v) {  // función-operador operator+
   x = x + v.x;
   y = y + v.y;
   return *this;
 }
};
int main () {     // =========
  float x = 5, y = 6;
  cout << "R = " << x + y << endl;  // M.2: versión global
  Vector v1 = {1, 2}, v2 = {3, 4};
  Vector v3 = v1 + v2;              // M.4: versión sobrecargada
  cout << "Rx = " << v3.x << endl;
  cout << "Ry = " << v3.y << endl;
}
Salida:
R = 11
Rx = 4
Ry = 6

Comentario

El ejemplo compila sin dificultad, confirmando que el operador + puede ser utilizado en M.4 con los objetos v1 y v2 de la clase Vector. El resultado obtenido para v3 es el esperado. Sin embargo, a pesar de su aparente idoneidad, tampoco en este caso el operador ha sido sobrecargado correctamente. Si sustituimos las referencias explícitas a v3 (en las sentencias M.4 y siguientes) por dos resultados auxiliares en la sentencia de salida:

  cout << "Rx = " << (v1 + v2).x << endl;    // M.4:
  cout << "Ry = " << (v1 + v2).y << endl;    // M.5:

El programa suministra la desconcertante salida siguiente:

R = 11
Rx = 4
Ry = 10

La razón de que el valor obtenido para Ry no sea el esperado, estriba en que con el diseño actual, la función operator+ modifica el primer operando, exactamente como lo hacía la función operator=. Esta asignación oculta también podría ser manifestada añadiendo una línea a la versión inicial del programa:

cout << "v1.x = " << v1.x << " v1.y = " << v1.y << endl;    // M.7:

En este caso las salidas habrían sido:

R = 11
Rx = 4
Ry = 6
v1.x = 4 v1.y = 6

Puede Consultar

Fuente