Overloading: differenze tra le versioni

m
nessun oggetto della modifica
m (Robot-assisted disambiguation: Java)
mNessun oggetto della modifica
In programmazione, si dice '''overloading''' una famiglia di [[Funzione (informatica)|funzioni/subroutine]] aventi lo stesso nome, ma con la possibilità di accettare un diverso set di argomenti ([[signature]]), ed eventualmente restituire un diverso [[valore di ritorno]]. Tale famiglia di funzioni è detta ''in rapporto di Overloading'', o ''sovraccaricata''.
 
A seconda dei casi, si può parlare di overloading di funzioni, di [[costruttoreCostruttore (oggetti)|costruttori]] e di [[operatoreOperatore (informatica)|operatori]].
Sovraccaricare il costruttore di una classe è una pratica comune per gli sviluppatori di librerie, in quanto permette loro di fornire allo sviluppatore finale diverse modalità per inizializzare la [[Classe (informatica)|classe]] con determinati valori iniziali.
 
</nowiki>
 
In questo modo è possibile inizializzare un'[[Istanza (informatica)|istanza]] della classe Persona sia fornendo manualmentenome ie daticognome come stringa che copiandoli da un'altra istanza di Persona. Allo stesso modo possiamo inserire in rubrica il nome e cognome manualmente oppure prenderli da un oggetto Persona.
Il codice di cui sopra è facilmente riutilizzabile in linguaggi come [[C (linguaggio)|C]], [[C++]], [[C sharp|C#]] e [[Java (linguaggio)|Java]], riscrivendo il tutto secondo la sintassi del linguaggio scelto.
 
}
</nowiki>
Vorremmo essere in grado di eseguire sui numeri complessi le stesse operazioni che eseguiamo normalmente sui [[numeri reali]]. Ad esempio, vorremmo poter eseguire il seguente codice:
A prescindere dal sovraccarico del costruttore, utile a inizializzare l'oggetto con più tipi di valori, e dalla mancanza di proprietà pubbliche per ottenere/impostare il valore del numero, ci si pone il problema del confronto. Un codice del tipo
<nowiki>
Complex c,d;
cout << c;
</nowiki>
Tale codice solleverebbe un errore di [[compilazione]], in quanto il [[compilatore]] non è in grado di valutare da solo se il complesso c è minore di d, nè tantomeno di scriverlo a video. La soluzione, adottabile '''solo''' in, [[C++]] e [[C sharp|C#]], è quella di definire un opportuno ''sovraccarico'' per gli operatori ''<'' e ''<<''. Per fare ciò è necessario conoscere come il compilatore dei linguaggi C tratta le espressioni con operatore. Esso le traduce con una chiamata a subroutine ''operator?()'', dove al posto di ''?'' va il simbolo dell'operatore. Ecco quindi i prototipi (e un paio di realizzazioni) di una completa famiglia di overloading per gli operatori principali di confronto e output.
NOTA: in una applicazione reale è richiesto l'utilizzo della [[libreria]] Math
<nowiki>
//operator<
}
</nowiki>
In linguaggio [[Visual Basic]] è possibile simulare il sovraccarico degli operatori implementando l'[[interfaccia]] IComparable.
 
==Note sull'overloading==
Un errore comune di molti programmatori è quello di voler creare due funzioni che accettano gli stessi tipi di parametri in ingresso e restituiscono un tipo differente. Ciò non è possibile perché l'esecutore identifica le [[Funzione (informatica)|funzioni]]/ e le [[subroutine]], a livello [[assembly]], mediante delle etichette ([[label]]). Tali label rispecchiano la [[''signature]]'' della funzione stessa, e pertanto due label uguali non possono coesistere all'interno di uno stesso spazio di visibilità. È comunque possibile definire due o più funzioni dalla stessa signature all'interno di [[namespace|spazi di nomi]] diversi senza ottenere errori di compilazione.
 
L'overloading, infine, non influisce sulla corretta esecuzione delle procedure [[Algoritmo ricorsivo|ricorsive]].
1 056

contributi