English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ Sobrecarga de operadores y sobrecarga de funciones

C++ Permite que en algún ámbito de unfuncionesYoperadoresSe especifican múltiples definiciones, denominadasSobrecarga de funcionesYSobrecarga de operadores.

La declaración de sobrecarga es una declaración de una función o método que tiene el mismo nombre que una función o método declarada anteriormente en el mismo ámbito, pero sus listas de parámetros y definiciones (implementaciones) son diferentes.

Cuando llama a unaSobrecarga de funcionesoSobrecarga de operadoresAl decidir la sobrecarga, el compilador compara el tipo de parámetros utilizados con los tipos de parámetros definidos y elige la definición más adecuada. El proceso de elección de la función de sobrecarga o el operador de sobrecarga más adecuado se denominaDecisión de sobrecarga.

C++ Sobrecarga de funciones

En el mismo ámbito, se pueden declarar varias funciones con el mismo nombre que tienen funcionalidades similares, pero los parámetros formales (referidos a la cantidad, tipo o orden de los parámetros) de estas funciones con el mismo nombre deben ser diferentes. No se puede sobrecargar una función solo mediante la diferencia en el tipo de retorno.

En el siguiente ejemplo, se utilizan funciones con el mismo nombre. print() se utiliza para imprimir diferentes tipos de datos:

#include <iostream>
using namespace std;
 
class printData
{
   public:
      void print(int i)
        cout << "Los enteros son: " << i << endl;
      }
 
      void print(double f)
        cout << "Los números de coma flotante son: " << f << endl;
      }
 
      void print(char c[])
        cout << "La cadena es: " << c << endl;
      }
};
 
int main(void)
{
   printData pd;
 
   // Imprimir entero
   pd.print(5);
   // Imprimir número de coma flotante
   pd.print(500.263);
   // Imprimir cadena
   char c[] = "Hello C++";
   pd.print(c);
 
   return 0;
}

当上面的代码被编译和执行时,它会产生以下结果:

Los enteros son: 5
Los números de coma flotante son: 500.263
La cadena es: Hello C++

C++ sobreoperación de operadores

puedes sobrecargar la mayoría de los operadores en++ operadores integrados. De esta manera, puedes usar operadores personalizados para tipos de datos personalizados.

Los operadores sobrecargados son funciones con nombres especiales, compuestas por la palabra clave operator seguida del símbolo del operador que se va a sobrecargar. Al igual que otras funciones, los operadores sobrecargados tienen un tipo de retorno y una lista de parámetros.

Box operator+(const Box&);

Se declara el operador de suma para sumar dos objetos Box y devolver el objeto Box final. La mayoría de los operadores sobrecargados pueden definirse como funciones no miembro o como funciones miembro. Si definimos la función anterior como una función no miembro de la clase, necesitamos pasar dos parámetros para cada operación, como se muestra a continuación:

Box operator+(const Box&, const Box&);

El siguiente ejemplo utiliza funciones miembro para ilustrar el concepto de sobrecarga de operadores. Aquí, el objeto se pasa como parámetro y se utilizan this operadores para acceder, como se muestra a continuación:

#include <iostream>
using namespace std;
 
class Box
{
   public:
 
      double getVolume(void)
      {
         return length * breadth * height;
      }
      void setLength(double len)
      {
          length = len;
      }
 
      void setBreadth(double bre)
      {
          breadth = bre;
      }
 
      void setHeight(double hei)
      {
          height = hei;
      }
      // 重载 + 运算符,用于将两个 Box 对象相加
      Box operator+(const Box& b)
      {
         Box box;
         box.length = this->length + b.length;
         box.breadth = this->breadth + b.breadth;
         box.height = this->height + b.height;
         return box;
      }
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};
// 程序的主函数
int main( )
{
   Box Box1;                // 声明 Box1,类型为 Box
   Box Box2;                // 声明 Box2,类型为 Box
   Box Box3;                // 声明 Box3,类型为 Box
   double volume = 0.0;     // 将体积存储在该变量中
 
   // Box1 详述
   Box1.setLength(6.0); 
   Box1.setBreadth(7.0); 
   Box1.setHeight(5.0);
 
   // Box2 详述
   Box2.setLength(12.0); 
   Box2.setBreadth(13.0); 
   Box2.setHeight(10.0);
 
   // Box1 的体积
   volume = Box1.getVolume();
   cout << "Box1的体积:" << volume << endl;
 
   // Box2 的体积
   volume = Box2.getVolume();
   cout << "Box2的体积:" << volume << endl;
 
   // 将两个对象相加,得到 Box3
   Box3 = Box1 + Box2;
 
   // Box3 的体积
   volume = Box3.getVolume();
   cout << "Box3的体积:" << volume << endl;
 
   return 0;
}

当上面的代码被编译和执行时,它会产生以下结果:

Box1的体积: 210
Box2的体积: 1560
Box3的体积: 5400

可重载运算符/不可重载运算符

以下是可重载的运算符列表:

双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)
关系运算符== (等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)
逻辑运算符||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符+ (正),-(负),*(指针),&(取地址)
自增自减运算符++(自增),--(自减)
位运算符|(按位或),&(按位与),~(按位取反),^(按位异或),(左移),(右移)
赋值运算符=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
空间申请与释放new, delete, new[], delete[]
其他运算符()(函数调用),-(成员访问),(逗号),(下标)

以下是不可重载的运算符列表:

  • .: Operador de acceso a miembro

  • .*, ->*: Operador de acceso a puntero de miembro

  • ::: Operador de ámbito

  • sizeof: Operador de longitud

  • ?:: Operador de condición

  • #: Símbolo de preprocesamiento

Ejemplo de sobrecarga de operadores

A continuación, se proporcionan varios ejemplos de sobrecarga de operadores para ayudarlo a comprender mejor el concepto.

NúmeroOperadores y ejemplos
1Sobrecarga del operador unario
2Sobrecarga del operador binario
3Sobrecarga del operador de relación
4Entrada/Sobrecarga del operador de salida
5 ++ Y -- Sobrecarga de operadores
6Sobrecarga del operador de asignación
7Operador de llamada de función () de sobrecarga
8Operador de subíndice [] de sobrecarga
9Operador de acceso a miembro de clase miembro -> Sobrecarga