C ++

Sobrecarga en C ++

Sobrecarga en C ++
C ++ no permite una función que suma dos enteros y devuelve un entero, para sumar dos flotantes y devolver un flotante. Imagina que hay una función para sumar dos enteros y devolver un entero. ¿No sería bueno tener otra función con el mismo nombre, que agregue solo dos o incluso más flotantes para devolver un flotante?? Se dice que hacerlo es sobrecargar la primera función.

Los operadores aritméticos se utilizan normalmente para operaciones aritméticas. ¿No es bueno tener el +, unir dos cadenas? Habilitar eso se dice que está sobrecargando el operador de suma aritmética, para cadenas.

El operador de incremento, ++ agrega 1 a un int o un flotante. Cuando se trata de 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 están 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 apuntar al 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. Tener conocimientos básicos en C ++ es necesario 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 agregar (int no1, int no2)

int suma = no1 + no2;
devolución de suma;

El prototipo de esta función es:
int agregar (int no1, int no2);
El prototipo de una función en el encabezado de la función, que termina con un punto y coma. La siguiente función con el mismo nombre, pero con un prototipo diferente, agregaría tres flotantes y devolvería un flotante:
flotar añadir (flotar no1, flotar no2, flotar no3)

suma flotante = no1 + no2 + no3;
devolución de suma;

¿Cómo diferencia el compilador a qué función llamar, ya que dos o más funciones tienen el mismo nombre?? El compilador usa el número de argumentos y tipos de argumentos para determinar qué función llamar. La lista de parámetros de funciones sobrecargadas debe diferir en su número y / o tipos de parámetros. Entonces, la llamada a la función,

int sm = agregar (2, 3);

llamaría a la función entera, mientras que la función llamaría,

flotar sme = agregar (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 en acción los segmentos de código anteriores:

#incluir
usando el espacio de nombres std;
int agregar (int no1, int no2)

int suma = no1 + no2;
devolución de suma;

flotar añadir (flotar no1, flotar no2, flotar no3)

suma flotante = no1 + no2 + no3;
devolución de suma;

int main ()

int sm = agregar (2, 3);
cout<flotar sme = agregar (2.3, 3.4, 2.0);
cout<return 0;

La salida es:
5
7.7

Sobrecarga del operador

Los operadores aritméticos se utilizan para sobrecargar operaciones en tipos de clases. Un iterador es un tipo de clase. Los operadores de incremento y decremento se utilizan para sobrecargar las operaciones de 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 de diseño simple, llamada clase de resorte. + concatena los literales de dos objetos de cadena, devolviendo un nuevo objeto con los literales concatenados. Concatenar dos literales significa unir el segundo literal al final del primer literal.

Ahora, C ++ tiene una función miembro especial para todas las clases, llamada operador. El programador puede utilizar esta función especial para sobrecargar operadores, como +. El siguiente programa muestra la sobrecarga del operador + para dos cadenas.

#incluir
usando el espacio de nombres std;
clase primavera

público:
// miembros de datos
char val [100];
int n;
char concat [100];
// funciones miembro
primavera (char arr [])

para (int i = 0; i<100; ++i)
val [i] = arr [i];
si (arr [i] == '\ 0')
rotura;

int i;
para (i = 0; i<100; ++i) if (arr[i] == '\0') break;
n = yo;

operador de resorte + (resorte y st)
int newLen = n + st.norte;
char newStr [newLen + 1];
para (int i = 0; ipara (int i = n; inewStr [newLen] = '\ 0';
spring obj (newStr);
return obj;

;
int main ()

char ch1 [] = "Te odio! "; resorte str1 (ch1);
char ch2 [] = "Pero ella te ama!"; resorte str2 (ch2);
char ch3 [] = "uno"; resorte str3 (ch3);
str3 = str1 + str2;
cout<return 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 cadena. Las cadenas en sí mismas 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, "primavera" para "cadena". El nombre especial, "operador, sigue esto". Después de eso, está el símbolo del operador (que se sobrecargará). 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 uno derecho. Sin embargo, según la especificación de 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 ordinario del operador.

Según la especificación de C ++, la definición del operador + toma solo el parámetro del operando derecho, porque el resto de la descripción de la clase es el parámetro del operando izquierdo.

En el código anterior, solo la definición de la función operador + () se ocupa de la sobrecarga +. El resto del código de la clase es 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 (instancia) un nuevo objeto de cadena, usando un argumento, newStr []. Al final de la definición de la función operator + (), se devuelve el objeto recién creado, que tiene la cadena concatenada.

En la función main (), la suma se realiza mediante la instrucció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 su +, llama a la función miembro operador + () en el objeto str1. La función miembro operator + () 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 las 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 (suma), "te odio! Pero ella te ama!". La función de miembro operator + () en el objeto str1, usa el literal de cadena de su propio objeto y el literal de cadena de su argumento, str2 para generar un literal de cadena unida.

Sobrecarga del operador del iterador

Al tratar con el iterador, al menos dos objetos están involucrados: una lista vinculada y el propio iterador. De hecho, están involucradas al menos dos clases: una clase desde la que se crea una instancia de una lista vinculada y una clase desde la que se crea una instancia de un iterador.

Lista enlazada

Un diagrama para un objeto de lista doblemente enlazada es:

Esta lista tiene tres elementos, pero puede haber más. Los tres elementos aquí son elementos de números 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 están en diferentes lugares en la serie de memoria, pero cada elemento consta de tres ubicaciones consecutivas.

Para cada elemento, la ubicación intermedia contiene el valor. La ubicación correcta tiene el puntero al siguiente elemento. La ubicación de la 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 de la izquierda apunta a un comienzo teórico de la lista.

Con la matriz, el operador de incremento (++), incrementa el puntero para apuntar a la siguiente ubicación física. 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 siguiente elemento lógicamente. La misma proyección se aplica al operador de decremento (-).

Un iterador de avance es un iterador que cuando se activa, apunta al siguiente elemento. Un iterador inverso es un iterador que, cuando está activado, apunta al elemento anterior.

Anuncio de sobrecarga ++ -

La sobrecarga de estos operadores se realiza en la descripción de clase (definición) del iterador.

La sintaxis para el prototipo del operador de incremento sobrecarga, prefijo, es

Operador ReturnType ++ ();

La sintaxis para el prototipo del operador de incremento sobrecarga, postfijo, es

Operador ReturnType ++ (int);

La sintaxis para el prototipo del operador de decremento sobrecarga, prefijo, es

Operador ReturnType - ();

La sintaxis para el prototipo del operador de incremento sobrecarga, postfijo, es

Operador ReturnType - (int);

Conclusión

Sobrecargar significa dar un significado diferente a una función o un operador. Las funciones están sobrecargadas en el mismo ámbito. Lo que diferencia a las funciones sobrecargadas es el número y / o 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 tipos diferentes, el compilador rechaza la sobrecarga - ver más adelante. Muchos operadores ordinarios se pueden sobrecargar en clases de las que se crean instancias de objetos. Esto se hace dando un tipo de retorno, una lista de parámetros y un cuerpo a la función especial denominada operador en la descripción de la clase.

OpenTTD frente a Simutrans
Crear su propia simulación de transporte puede ser divertido, relajante y extremadamente atractivo. Es por eso que debes asegurarte de probar tantos j...
Tutorial de OpenTTD
OpenTTD es uno de los juegos de simulación empresarial más populares que existen. En este juego, necesitas crear un maravilloso negocio de transporte....
SuperTuxKart para Linux
SuperTuxKart es un gran título diseñado para ofrecerte la experiencia Mario Kart de forma gratuita en tu sistema Linux. Es bastante desafiante y diver...