C++

Sovraccarico in C++

Sovraccarico in C++
C++ non consente a una funzione che aggiunge due interi e restituisce un intero, di aggiungere due float e restituire un float. Immagina che ci sia una funzione per aggiungere due interi e restituire un intero. Non sarebbe bello avere un'altra funzione con lo stesso nome, che aggiunge solo due o anche più float per restituire un float?? Si dice che così facendo si sovraccarica la prima funzione.

Gli operatori aritmetici sono tipicamente usati per le operazioni aritmetiche. Non è bello avere il +, unire due stringhe?? Abilitazione che si dice sovraccarica l'operatore di addizione aritmetica, per le stringhe.

L'operatore di incremento, ++ aggiunge 1 a un int o a un float. Quando si tratta di puntatori, non aggiunge 1 al puntatore. Fa puntare il puntatore al prossimo oggetto consecutivo in memoria. Un iteratore punta all'oggetto successivo in una lista concatenata, ma gli oggetti della lista concatenata si trovano in posti diversi nella memoria (non in regioni consecutive). Non sarebbe bello sovraccaricare l'operatore di incremento per un iteratore, per incrementare ma puntare al seguente elemento, nell'elenco concatenato?

Questo articolo spiega il sovraccarico in C++. È diviso in due parti: sovraccarico delle funzioni e sovraccarico dell'operatore. Avere già conoscenze di base in C++ è necessario per comprendere il resto dell'articolo.

Contenuto dell'articolo

Sovraccarico delle funzioni

La seguente funzione aggiunge due int e restituisce un int:

int add(int no1, int no2)

int somma = no1 + no2;
somma di ritorno;

Il prototipo di questa funzione è:
int add(int no1, int no2);
Il prototipo di una funzione nell'intestazione della funzione, che termina con un punto e virgola. La seguente funzione con lo stesso nome, ma con un prototipo diverso, aggiungerebbe tre float e restituirebbe un float:
float add (float no1, float no2, float no3)

somma float = no1 + no2 + no3;
somma di ritorno;

In che modo il compilatore differenzia quale funzione chiamare, dal momento che due o più funzioni hanno lo stesso nome?? Il compilatore usa il numero di argomenti e tipi di argomenti per determinare quale funzione chiamare. L'elenco dei parametri delle funzioni sovraccaricate dovrebbe differire per numero e/o tipi di parametri. Quindi, la chiamata di funzione,

int sm = add(2, 3);

chiamerebbe la funzione intera, mentre la funzione call,

float sme = add(2.3, 3.4, 2.0);

chiamerebbe la funzione float. Nota: ci sono situazioni in cui il compilatore rifiuterà una funzione sovraccaricata quando il numero di argomenti è lo stesso ma di tipo diverso! - Motivo: - vedi dopo.

Il seguente programma mette in azione i segmenti di codice di cui sopra:

#includere
usando lo spazio dei nomi std;
int add(int no1, int no2)

int somma = no1 + no2;
somma di ritorno;

float add (float no1, float no2, float no3)

somma flottante = no1 + no2 + no3;
somma di ritorno;

intero principale()

int sm = add(2, 3);
cout<float sme = add(2.3, 3.4, 2.0);
cout<restituisce 0;

L'uscita è:
5
7.7

Sovraccarico dell'operatore

Gli operatori aritmetici sono usati per sovraccaricare le operazioni nei tipi di classe. Un iteratore è un tipo di classe. Gli operatori di incremento e decremento vengono utilizzati per sovraccaricare le operazioni per un iteratore.

Esempio di sovraccarico dell'operatore di classe stringa

Questa sezione fornisce un esempio, in cui + viene sovraccaricato per una classe stringa progettata semplicemente, chiamata classe spring. + concatena i letterali di due oggetti stringa, restituendo un nuovo oggetto con i letterali concatenati. Concatenare due letterali significa unire il secondo letterale alla fine del primo letterale.

Ora, il C++ ha una funzione membro speciale per tutte le classi, chiamata operatore. Il programmatore può utilizzare questa funzione speciale per sovraccaricare gli operatori, come ad esempio +. Il seguente programma mostra l'overload dell'operatore + per due stringhe.

#includere
usando lo spazio dei nomi std;
classe primavera

pubblico:
//membri dati
char val[100];
int n;
char concat[100];
//funzioni membro
primavera (char arr[])

per (int i=0; i<100; ++i)
val[i] = arr[i];
if (arr[i] == '\0')
rompere;

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

operatore primavera+(molla& st)
int nuovaLen = n + st.n;
char nuovaStr[nuovaLen+1];
per (int i=0; iper (int i=n; inewStr[newLen] = '\0';
spring obj(newStr);
restituire obj;

;
intero principale()

char ch1[] = "Ti odio! "; molla str1(ch1);
char ch2[] = "Ma lei ti ama!"; molla str2(ch2);
char ch3[] = "uno"; molla str3(ca3);
str3 = str1 + str2;
cout<restituisce 0;

Il valore di str1 è "Ti odio! ". Il valore di str2 è "Ma lei ti ama!". Il valore di str3, ovvero str1 + str2, è l'output:

"Ti odio! Ma lei ti ama!"

che è la concatenazione dei due letterali stringa. Le stringhe stesse sono oggetti istanziati.

La definizione della funzione operatore è all'interno della descrizione (definizione) della classe stringa string. Inizia con il tipo restituito, "molla" per "stringa". Il nome speciale, "operatore, segui questo". Dopo di che c'è il simbolo dell'operatore (da sovraccaricare). Poi c'è l'elenco dei parametri, che in realtà è l'elenco degli operandi. + è un operatore binario: significa che prende un operando sinistro e uno destro. Tuttavia, secondo la specifica C++, l'elenco dei parametri qui ha solo il parametro giusto. Poi c'è il corpo della funzione dell'operatore, che imita il normale comportamento dell'operatore.

Secondo la specifica C++, la definizione dell'operatore + accetta solo il parametro dell'operando destro, poiché il resto della descrizione della classe è il parametro dell'operando sinistro.

Nel codice sopra, solo la definizione della funzione operator+() riguarda il + overload. Il resto del codice per la classe è codifica normale. All'interno di questa definizione, i due letterali stringa sono concatenati nell'array, newStr[]. Successivamente, viene effettivamente creato un nuovo oggetto stringa (istanziato), utilizzando un argomento, newStr[]. Alla fine della definizione della funzione operator+(), viene restituito l'oggetto appena creato, avente la stringa concatenata.

Nella funzione main(), l'addizione viene eseguita dall'istruzione:

str3 = str1 + str2;

Dove str1, str2 e str3 sono oggetti stringa che sono già stati creati in main(). L'espressione, "str1 + str2" con il suo +, chiama la funzione membro operator+() nell'oggetto str1. La funzione membro operator+() nell'oggetto str1 utilizza str2 come argomento e restituisce il nuovo oggetto con (sviluppato) la stringa concatenata. L'operatore di assegnazione (=) dell'istruzione completa, sostituisce il contenuto (valori delle variabili) dell'oggetto str3, con quelli dell'oggetto restituito. Nella funzione main(), dopo l'aggiunta, il valore del membro dati str3.val non è più "uno"; è la stringa concatenata (addizione), "Ti odio! Ma lei ti ama!". La funzione membro operator+() nell'oggetto str1, utilizza il letterale stringa del proprio oggetto e il letterale stringa del suo argomento, str2 per ottenere un letterale stringa unito.

Sovraccarico dell'operatore dell'iteratore

Quando si ha a che fare con l'iteratore, sono coinvolti almeno due oggetti: una lista collegata e l'iteratore stesso. In effetti, sono coinvolte almeno due classi: una classe da cui viene istanziata una lista concatenata e una classe da cui viene istanziato un iteratore.

Lista collegata

Un diagramma per un oggetto lista doppiamente collegata è:

Questa lista ha tre elementi, ma ce ne possono essere di più. I tre elementi qui sono elementi di numeri interi. Il primo ha il valore 14; il successivo ha il valore 88; e l'ultimo ha il valore, 47. Ogni elemento qui consiste di tre posizioni consecutive.

Questo è diverso dall'array, dove ogni elemento è una posizione e tutti gli elementi dell'array sono in posizioni consecutive. Qui, i diversi elementi si trovano in punti diversi della serie di memoria, ma ogni elemento è costituito da tre posizioni consecutive.

Per ogni elemento, la posizione centrale contiene il valore. La posizione giusta ha il puntatore all'elemento successivo. La posizione a sinistra ha il puntatore all'elemento precedente. Per l'ultimo elemento, la giusta posizione indica una fine teorica dell'elenco. Per il primo elemento, la posizione a sinistra indica un inizio teorico dell'elenco.

Con l'array, l'operatore di incremento (++), incrementa il puntatore in modo che punti alla posizione fisicamente successiva. Con l'elenco, gli elementi non sono in regioni consecutive in memoria. Quindi, l'operatore di incremento può essere sovraccaricato, sposta l'iteratore (puntatore) da un elemento all'elemento logicamente successivo. La stessa proiezione si applica all'operatore di decremento (-).

Un iteratore in avanti è un iteratore che, quando attivato, punta all'elemento successivo. Un iteratore inverso è un iteratore che, quando attivato, punta all'elemento precedente.

Sovraccarico ++ annuncio -

Il sovraccarico di questi operatori viene eseguito nella descrizione della classe (definizione) dell'iteratore.

La sintassi per il prototipo dell'overloading dell'operatore di incremento, prefisso, è

operatore ReturnType++();

La sintassi per il prototipo dell'overloading dell'operatore di incremento, postfix, è

ReturnType operator++(int);

La sintassi per il prototipo dell'overloading dell'operatore decremento, prefisso, è

operatore ReturnType--();

La sintassi per il prototipo dell'overloading dell'operatore di incremento, postfix, è

Operatore ReturnType--(int);

Conclusione

Sovraccaricare significa dare un significato diverso ad una funzione o ad un operatore. Le funzioni sono sovraccaricate nello stesso ambito. Ciò che differenzia le funzioni sovraccaricate sono il numero e/o i tipi di parametri nei loro elenchi di parametri. In alcuni casi, dove il numero dei parametri è lo stesso, ma con tipi diversi, il compilatore rifiuta l'overload - vedi più avanti. Molti operatori ordinari possono essere sovraccaricati nelle classi da cui vengono istanziati oggetti objects. Questo viene fatto dando un tipo restituito, un elenco di parametri e un corpo, alla funzione speciale denominata, operator, nella descrizione della classe.

Battaglia per Wesnoth 1.13.6 Sviluppo rilasciato
Battaglia per Wesnoth 1.13.6 rilasciato il mese scorso, è la sesta versione di sviluppo nella 1.13.x e offre una serie di miglioramenti, in particolar...
Come installare League Of Legends su Ubuntu 14.04
Se sei un fan di League of Legends, questa è un'opportunità per testare League of Legends. Nota che LOL è supportato su PlayOnLinux se sei un utente L...
Installa l'ultimo gioco di strategia OpenRA su Ubuntu Linux
OpenRA è un motore di gioco di strategia in tempo reale gratuito/libero che ricrea i primi giochi di Westwood come il classico Command & Conquer: Red ...