Los operadores aritméticos se usan típicamente para operaciones aritméticas. ¿No es bueno tener el +, une dos cuerdas?? Habilitando que se dice que está sobrecargando el operador de adición de aritmética, para cadenas.
El operador de incremento, ++ agrega 1 a un int o un flotador. Al tratar con punteros, no agrega 1 al puntero. Hace que el puntero apunte al siguiente objeto consecutivo en la memoria. Un iterador apunta al siguiente objeto en una lista vinculada, pero los objetos de la lista vinculada se encuentran en diferentes lugares de la memoria (no en regiones consecutivas). ¿No sería bueno sobrecargar el operador de incremento para un iterador, para incrementar pero señalar el siguiente elemento, en la lista vinculada??
Este artículo explica la sobrecarga en C++. Se divide en dos partes: sobrecarga de funciones y sobrecarga del operador. Es necesario tener un conocimiento básico en C ++ para comprender el resto del artículo.
Contenido del artículo
Sobrecarga de funciones
La siguiente función agrega dos ints y devuelve un int:
int add (int no1, int no2)
int sum = no1 + no2;
suma de retorno;
El prototipo de esta función es:
int add (int no1, int no2);
El prototipo de una función en el encabezado de la función, terminando con un punto y coma. La siguiente función con el mismo nombre, pero con un prototipo diferente, agregaría tres flotadores y devolvería un flotador:
FLOAT ADD (FLOAT NO1, FLOAT NO2, FLOAT NO3)
Float Sum = NO1 + NO2 + NO3;
suma de retorno;
¿Cómo se diferencia el compilador qué funciona llamar, ya que dos o más funciones tienen el mismo nombre?? El compilador utiliza el número de argumentos y tipos de argumentos para determinar qué función llamar. La lista de parámetros de las funciones sobrecargadas debe diferir en su número y/o tipos de parámetros. Entonces, la llamada de función,
int sm = add (2, 3);
llamaría a la función entera, mientras que la función de la función,
Float SME = ADD (2.3, 3.4, 2.0);
llamaría a la función flotante. Nota: Hay situaciones en las que el compilador rechazará una función sobrecargada cuando el número de argumentos es el mismo pero de diferentes tipos! - Razón: - Ver más tarde.
El siguiente programa pone los segmentos de código anteriores en acción:
#incluir
usando el espacio de nombres STD;
int add (int no1, int no2)
int sum = no1 + no2;
suma de retorno;
FLOAT ADD (FLOAT NO1, FLOAT NO2, FLOAT NO3)
Float Sum = NO1 + NO2 + NO3;
suma de retorno;
int main ()
int sm = add (2, 3);
cout<Float SME = ADD (2.3, 3.4, 2.0);
cout<regresar 0;
La salida es:
5Sobrecarga del operador
Los operadores aritméticos se utilizan para sobrecargar las operaciones en los tipos de clases. Un iterador es un tipo de clase. Los operadores de incremento y disminución se utilizan para sobrecargar las operaciones para un iterador.
Ejemplo de sobrecarga del operador de clase de cadena
Esta sección proporciona un ejemplo, donde + está sobrecargado para una clase de cadena simplemente diseñada, llamada clase de primavera. + concatena los literales de dos objetos de cadena, devolviendo un nuevo objeto con los literales concatenados. Concatenar dos literales significa unirse al segundo literal al final de la primera literal.
Ahora, C ++ tiene una función miembro especial para todas las clases, llamada operador. El programador puede usar esta función especial para sobrecargar operadores, como +. El siguiente programa muestra la sobrecarga del operador + para dos cuerdas.
#incluir
usando el espacio de nombres STD;
Spring de clase
público:
// miembros de datos
char val [100];
int n;
char concat [100];
// Funciones para miembros
primavera (char arr [])
para (int i = 0; i<100; ++i)
val [i] = arr [i];
if (arr [i] == '\ 0')
romper;
int i;
para (i = 0; i<100; ++i) if (arr[i] == '\0') break;
n = i;
Operador de primavera+(Spring & ST)
int newlen = n + st.norte;
Char Newstr [Newlen+1];
para (int i = 0; ipara (int i = n; i Newstr [newlen] = '\ 0';
OBJ de primavera (Newstr);
regresar obj;
;
int main ()
char ch1 [] = "Te odio! "; Spring Str1 (CH1);
char ch2 [] = "Pero ella te ama!"; Spring Str2 (CH2);
char ch3 [] = "uno"; Spring Str3 (CH3);
str3 = str1 + str2;
cout<regresar 0;
El valor de Str1 es "Te odio! ". El valor de Str2 es "pero ella te ama!". El valor de str3, que es, str1 + str2, es la salida:
"Te odio! Pero ella te ama!"que es la concatenación de los dos literales de cuerda. Las cadenas en sí son objetos instanciados.
La definición de la función del operador está dentro de la descripción (definición) de la clase de cadena. Comienza con el tipo de retorno, "Spring" para "cadena". El nombre especial, "Operador, sigue esto". Después de eso, está el símbolo del operador (para ser sobrecargado). Luego está la lista de parámetros, que en realidad es la lista de operandos. + es un operador binario: lo que significa que toma un operando izquierdo y derecho. Sin embargo, mediante la especificación C ++, la lista de parámetros aquí solo tiene el parámetro correcto. Luego está el cuerpo de la función del operador, que imita el comportamiento del operador ordinario.
Mediante la especificación de C ++, la definición del operador+ toma solo el parámetro de operando correcto, porque el resto de la descripción de la clase es el parámetro de operando izquierdo.
En el código anterior, solo la definición de función del operador + () se ocupa de la sobrecarga +. El resto del código para la clase es una codificación normal. Dentro de esta definición, los dos literales de cadena se concatenan en la matriz, Newstr []. Después de eso, se crea un nuevo objeto de cadena (instanciado), usando un argumento, Newstr []. Al final de la definición de función de operador+(), se devuelve el objeto recién creado, que tiene la cadena concatenada.
En la función main (), la adición se realiza por la declaración:
str3 = str1 + str2;
Donde str1, str2 y str3 son objetos de cadena que ya se han creado en main (). La expresión, "str1 +str2" con its +, llama a la función de miembro del operador +() en el objeto str1. La función miembro operador+() en el objeto STR1 usa Str2 como argumento y devuelve el nuevo objeto con (desarrollado) la cadena concatenada. El operador de asignación (=) de la declaración completa, reemplaza el contenido (valores de variables) del objeto STR3, con los del objeto devuelto. En la función main (), después de la adición, el valor del miembro de datos Str3.Val ya no es "uno"; Es la cadena concatenada (adición), "Te odio! Pero ella te ama!". La función miembro del operador+() en el objeto STR1, usa la cadena literal de su propio objeto, y la cadena literal de su argumento, STR2 para crear una cadena unida literal.
Sobrecarga del operador iterador
Al tratar con el iterador, están involucrados al menos dos objetos: una lista vinculada y el propio iterador. De hecho, al menos dos clases están involucradas: una clase desde la cual se instancia una lista vinculada y una clase de la cual se instancia un iterador.
Lista enlazada
Un diagrama para un objeto de lista doblemente vinculada es:
Esta lista tiene tres elementos, pero puede haber más. Los tres elementos aquí son elementos de enteros. El primero tiene el valor, 14; El siguiente tiene el valor, 88; y el último tiene el valor, 47. Cada elemento aquí consta de tres ubicaciones consecutivas.
Esto es diferente a la matriz, donde cada elemento es una ubicación, y todos los elementos de la matriz están en ubicaciones consecutivas. Aquí, los diferentes elementos se encuentran en diferentes lugares de la serie de memoria, pero cada elemento consta de tres ubicaciones consecutivas.
Para cada elemento, la ubicación central contiene el valor. La ubicación correcta tiene el puntero al siguiente elemento. La ubicación izquierda tiene el puntero al elemento anterior. Para el último elemento, la ubicación correcta apunta a un final teórico de la lista. Para el primer elemento, la ubicación izquierda apunta a un inicio teórico de la lista.
Con la matriz, el operador de incremento (++), incrementa el puntero para apuntar a la ubicación física siguiente. Con la lista, los elementos no están en regiones consecutivas en la memoria. Entonces, el operador de incremento se puede sobrecargar, mueva el iterador (puntero) de un elemento al elemento siguiente lógicamente. La misma proyección se aplica al operador de disminución (-).
Un iterador delantero es un iterador que cuando se compromete, apunta al siguiente elemento. Un iterador inverso es un iterador, que cuando se compromete, apunta al elemento anterior.
Sobrecarga ++ AD -
La sobrecarga de estos operadores se realiza en la descripción de la clase (definición) del iterador.
La sintaxis para el prototipo de la sobrecarga del operador de incremento, prefijo, es
ReturnType Operator ++ ();
La sintaxis para el prototipo de la sobrecarga del operador de incremento, Postfix, es
ReturnType Operator ++ (int);
La sintaxis para el prototipo de la sobrecarga del operador de disminución, el prefijo, es
Operador ReturnType-();
La sintaxis para el prototipo de la sobrecarga del operador de incremento, Postfix, es
Operador de retorno de retorno-(int);
Conclusión
Sobrecargar significa dar un significado diferente a una función o un operador. Las funciones están sobrecargadas en el mismo alcance. Lo que diferencia las funciones sobrecargadas son el número y/o los tipos de parámetros en sus listas de parámetros. En algunos casos, donde el número de parámetros es el mismo, pero con diferentes tipos, el compilador rechaza la sobrecarga, ver más tarde. Muchos operadores ordinarios se pueden sobrecargar en clases desde las cuales se instancian los objetos. Esto se hace dando un tipo de retorno, lista de parámetros y cuerpo a la función especial llamada, operador, en la descripción de la clase.