C++ Sobrecarga de operadores y funciones

C++ permite que en el mismo ámbito un ciertofunciónyoperadorespecifique múltiples definiciones, denominadas respectivamentesobrecarga de funcionesysobrecarga de operadores。

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

Cuando usted llama auna función sobrecargadaoun operador sobrecargadoel compilador determina la definición más adecuada comparando los tipos de parámetros que usted usa con los tipos de parámetros de las definiciones. El proceso de seleccionar la función sobrecargada o el operador sobrecargado más adecuado se denominaresolución de sobrecarga。

Sobrecarga de funciones en C++

En el mismo ámbito, se pueden declarar varias funciones con el mismo nombre y funcionalidad similar, pero los parámetros formales de estas funciones con el mismo nombre (es decir, el número, tipo u orden de los parámetros) deben ser diferentes. No se puede sobrecargar una función únicamente por un tipo de retorno diferente.

En el siguiente ejemplo, la función con el mismo nombreprint()se utiliza para generar diferentes tipos de datos:

Ejemplo

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

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

整数为: 5
浮点数为: 500.263
字符串为: Hello C++

Sobrecarga de operadores en C++

Puede redefinir o sobrecargar la mayoría de los operadores integrados de C++. De esta manera, puede usar operadores con tipos personalizados.

Los operadores sobrecargados son funciones con nombres especiales; el nombre de la función está formado por la palabra clave operator y el símbolo del operador que se va a sobrecargar a continuación. Al igual que otras funciones, un operador sobrecargado tiene un tipo de retorno y una lista de parámetros.

Box operator+(const Box&);

Declare 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 normales no miembro o como funciones miembro de una clase. Si definimos la función anterior como una función no miembro de la clase, entonces necesitamos pasar dos parámetros para cada operación, como se muestra a continuación:

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

El siguiente ejemplo demuestra el concepto de sobrecarga de operadores usando funciones miembro. Aquí, los objetos se pasan como parámetros y las propiedades de los objetos se acceden usandothisoperador, como se muestra a continuación:

Ejemplo

#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; } // Sobrecargar el operador + para sumar dos objetos 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; // Longitud double breadth; // Ancho double height; // Altura }; // Función principal del programa int main( ) { Box Box1; // Declarar Box1, de tipo Box Box Box2; // Declarar Box2, de tipo Box Box Box3; // Declarar Box3, de tipo Box double volume = 0.0; // Almacenar el volumen en esa variable // Detalles de Box1 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Detalles de Box2 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Volumen de Box1 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // Volumen de Box2 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // Sumar los dos objetos para obtener Box3 Box3 = Box1 + Box2; // Volumen de Box3 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return 0; }

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

Operadores sobrecargables / no sobrecargables

La siguiente es la lista de operadores sobrecargables:

Operadores aritméticos binarios + (suma), - (resta), * (multiplicación), / (división), % (módulo)
Operadores relacionales == (igual), != (no igual), < (menor que), > (mayor que), <= (menor o igual que), >= (mayor o igual que)
Operadores lógicos || (O lógico), && (Y lógico), ! (NO lógico)
Operadores unarios + (positivo), - (negativo), * (puntero), & (dirección de)
Operadores de incremento y decremento ++ (incremento), -- (decremento)
Operadores de bits | (OR bit a bit), & (AND bit a bit), ~ (NOT bit a bit), ^ (XOR bit a bit), << (desplazamiento a la izquierda), >> (desplazamiento a la derecha)
Operadores de asignación =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
Asignación y liberación de memoria new, delete, new[ ] , delete[]
Otros operadores ()(llamada a función),->(acceso a miembro),,(coma),[](subíndice)

La siguiente es la lista de operadores no sobrecargables:

  • .. Operador de acceso a miembro
  • .*, ->*.* Operador de acceso a puntero a miembro
  • :::: Operador de ámbito
  • sizeofsizeof Operador de tamaño
  • ?:?: Operador condicional
  • ## Símbolo de preprocesador

Ejemplo de sobrecarga de operadores

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

N.ºOperadores y ejemplos
1Sobrecarga de operadores unarios
2Sobrecarga de operadores binarios
3Sobrecarga de operadores relacionales
4Sobrecarga de operadores de entrada/salida
5Sobrecarga de los operadores ++ y --
6Sobrecarga del operador de asignación
7Sobrecarga del operador de llamada a función ()
8Sobrecarga del operador de subíndice []
9Sobrecarga del operador de acceso a miembro de clase ->
Otras extensiones