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
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
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.