Sovraccarico in C ++

Sovraccarico in C ++
C ++ non consente una funzione che aggiunge due numeri interi e restituisca un numero intero, per aggiungere due galleggianti e restituire un galleggiante. Immagina che ci sia una funzione per aggiungere due numeri interi e restituire un numero intero. Non sarebbe bello avere un'altra funzione con lo stesso nome, che aggiunge ma due o ancora più galleggianti per restituire un galleggiante? Si dice che ciò sia, sovraccaricare la prima funzione.

Gli operatori aritmetici sono in genere utilizzati per le operazioni aritmetiche. Non è bello avere il +, unisciti a due stringhe? Si dice che si dice che sovraccarichi l'operatore di aggiunta aritmetica, per le stringhe.

L'operatore di incremento, ++ aggiunge 1 a un int o un galleggiante. Quando si tratta di puntatori, non aggiunge 1 al puntatore. Fa indicare il puntatore all'oggetto consecutivo successivo in memoria. Un iteratore indica l'oggetto successivo in una lista collegata, ma gli oggetti di lista collegati sono in diversi luoghi in memoria (non nelle regioni consecutive). Non sarebbe bello sovraccaricare l'operatore di incremento per un iteratore, per incrementare ma indicare il seguente elemento, nell'elenco collegato?

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

Contenuto dell'articolo

  • Sovraccarico di funzioni
  • Sovraccarico dell'operatore
  • Esempio di sovraccarico dell'operatore di classe stringa
  • Sovraccarico dell'operatore iteratore
  • Conclusione

Sovraccarico di funzioni

La seguente funzione aggiunge due int e restituisce un int:

Int Add (int n., int no2)

int sum = no1 + no2;
Somma di ritorno;

Il prototipo di questa funzione è:

int add (int no1, int n.);

Il prototipo di una funzione nell'intestazione della funzione, terminando con un punto e virgola. La seguente funzione con lo stesso nome, ma con un prototipo diverso, aggiungerebbe tre galleggianti e restituirebbe un galleggiante:

float aggiungi (float n., float no2, float no3)

Float Sum = NO1 + NO2 + NO3;
Somma di ritorno;

In che modo il compilatore differenzia la funzione da chiamare, poiché due o più funzioni hanno lo stesso nome? Il compilatore utilizza il numero di argomenti e tipi di argomentazioni per determinare quale funzione chiamare. L'elenco dei parametri delle funzioni sovraccarichi dovrebbe differire nei loro tipi di parametri e/o parametri. Quindi, la funzione chiamata,

int sm = aggiungi (2, 3);

chiamerei la funzione intera, mentre la funzione chiamata,

Float PME = Aggiungi (2.3, 3.4, 2.0);

chiamerei la funzione float. Nota: ci sono situazioni in cui il compilatore rifiuterà una funzione sovraccarica quando il numero di argomenti è lo stesso ma di tipi diversi! - Motivo: - Vedi più tardi.

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

#includere
Utilizzo dello spazio dei nomi std;
Int Add (int n., int no2)

int sum = no1 + no2;
Somma di ritorno;

float aggiungi (float n., float no2, float no3)

Float Sum = NO1 + NO2 + NO3;
Somma di ritorno;

int main ()

int sm = aggiungi (2, 3);
cout<Float PME = Aggiungi (2.3, 3.4, 2.0);
cout<restituzione 0;

L'output è:

5
7.7

Sovraccarico dell'operatore

Gli operatori aritmetici vengono utilizzati 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 + è sovraccarico per una classe di stringhe semplicemente progettata, chiamata classe Spring. + Concatena i letterali di due oggetti stringa, restituendo un nuovo oggetto con i letterali concatenati. Concatenare due letterali significa unirsi al secondo letterale fino alla fine del primo letterale.

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

#includere
Utilizzo dello spazio dei nomi std;
Primavera di classe

pubblico:
// Membri di dati
char val [100];
int n;
Char Concat [100];
// funzioni del membro
Spring (char arr [])

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

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

Spring Operator+(Spring & St)
int newlen = n + st.N;
Char Newstr [newlen+1];
per (int i = 0; iper (int i = n; iNewstr [newlen] = '\ 0';
Spring Obj (Newstr);
restituire obj;

;
int main ()

char ch1 [] = "Ti odio! "; Spring STR1 (CH1);
char ch2 [] = "ma lei ti ama!"; Spring STR2 (CH2);
char ch3 [] = "one"; Spring STR3 (CH3);
STR3 = STR1 + STR2;
cout<restituzione 0;

Il valore di STR1 è "Ti odio! ". Il valore di STR2 è "ma lei ti ama!". Il valore di STR3, che è, STR1 + STR2, è l'uscita:

"Ti odio! Ma lei ti ama!"

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

La definizione della funzione operatore è all'interno della descrizione (definizione) della classe stringa. Inizia con il tipo di ritorno, "Spring" per "String". Il nome speciale, "Operatore, segui questo". Successivamente, c'è il simbolo dell'operatore (da sovraccarico). Quindi c'è l'elenco dei parametri, che in realtà è l'elenco operativo. + è un operatore binario: il che significa che prende una sinistra e un operando destro. Tuttavia, secondo la specifica C ++, l'elenco dei parametri qui ha solo il parametro giusto. Quindi c'è il corpo della funzione dell'operatore, che imita il comportamento dell'operatore ordinario.

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

Nel codice sopra, solo la definizione della funzione dell'operatore + () si occupa del sovraccarico +. Il resto del codice per la classe è la codifica normale. All'interno di questa definizione, i letterali a due stringhe sono concatenati nell'array, Newstr []. Successivamente, viene effettivamente creato un nuovo oggetto stringa (istanziato), usando un argomento, Newstr []. Alla fine della definizione della funzione dell'operatore+(), viene restituito l'oggetto appena creato.

Nella funzione principale (), l'aggiunta viene eseguita dalla dichiarazione:

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 dell'operatore +() nell'oggetto STR1. La funzione membro dell'operatore+() 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 principale (), dopo l'aggiunta, il valore dell'elemento dati STR3.Val non è più "uno"; È la stringa concatenata (aggiunta), "Ti odio! Ma lei ti ama!". La funzione membro dell'operatore+() nell'oggetto STR1, utilizza letterale la stringa del proprio oggetto e la stringa letterale del suo argomento, STR2 per elaborare una stringa unita letterale.

Sovraccarico dell'operatore iteratore

Quando si tratta di 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 collegata e una classe da cui viene istanziata un iteratore.

Lista collegata

Un diagramma per un oggetto doppiamente collegato è:

Questo elenco ha tre elementi, ma ci possono essere di più. I tre elementi qui sono elementi di numeri interi. Il primo ha il valore, 14; Il prossimo ha il valore, 88; e l'ultimo ha il valore, 47. Ogni elemento qui è costituito da tre posizioni consecutive.

Questo è diverso dall'array, in cui ogni elemento è una posizione e tutti gli elementi dell'array si trovano in posizioni consecutive. Qui, i diversi elementi sono in diversi luoghi 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 dell'elemento precedente. Per l'ultimo elemento, la posizione giusta punta a un'estremità teorica dell'elenco. Per il primo elemento, la posizione sinistra punta a un inizio teorico dell'elenco.

Con l'array, l'operatore di incremento (++), incrementa il puntatore per indicare la posizione fisicamente successiva. Con l'elenco, gli elementi non si trovano in regioni consecutive in memoria. Quindi, l'operatore di incremento può essere sovraccarico, 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, se impegnato, indica l'elemento successivo. Un iteratore inverso è un iteratore, che quando impegnato, indica l'elemento precedente.

Sovraccarico ++ annuncio -

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

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

ReturnType Operator ++ ();

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

ReturnType Operator ++ (int);

La sintassi per il prototipo del sovraccarico dell'operatore di decremento, prefisso, è

ReturnType Operator-();

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

Operatore di returnType-(int);

Conclusione

Sovraccarico significa dare un significato diverso a una funzione o un operatore. Le funzioni sono sovraccaricate nello stesso ambito. Ciò che differenzia le funzioni sovraccarichi sono il numero e/o i tipi di parametri nelle loro elenchi di parametri. In alcuni casi, in cui il numero dei parametri è lo stesso, ma con tipi diversi, il compilatore rifiuta il sovraccarico - vedi più avanti. Molti operatori ordinari possono essere sovraccarichi in classi da cui sono istanziati gli oggetti. Questo viene fatto dando un tipo di ritorno, un elenco di parametri e un corpo, alla funzione speciale denominata, operatore, nella descrizione della classe.