2013-04-08 10 views
11

Sono ancora relativamente nuovo in C++ e non riesco a capire la differenza nei due modi seguenti di codificare una funzione che può richiedere un parametro o forse due o tre o più. Comunque, ecco il mio puntoSovraccarico di un metodo o utilizzare valori predefiniti? C++

sovraccarico funzione:

int aClass::doSomething(int required) 
{ 
    //DO SOMETHING 
} 

int aClass::doSomething(int required, int optional) 
{ 
    //DO SOMETHING 
} 

come è questo diverso, valore di default:

int aClass::doSomething(int required, int optional = 0) 
{ 
    //DO SOMETHING 
} 

conosco in diverse circostanze si può essere più adatto di un altro, ma che tipo di cose dovrei essere a conoscenza quando si sceglie tra ciascuna di queste opzioni?

risposta

6

Prima di tutto, stai parlando di sovraccarico, non ignorante. L'override viene eseguita per le funzioni virtual in una classe derivata. Il sovraccarico si riferisce allo stesso nome di funzione con una firma diversa.

La differenza è logica: nel primo caso (2 versioni), le due funzioni possono comportarsi in modo completamente diverso, mentre il secondo caso avrà più o meno la stessa logica. Dipende davvero da te.

2

Si sta utilizzando la funzione di sovraccarico, se si forniscono più constructor s. Il vantaggio in questo caso è che puoi reagire in modo diverso in ogni constructor sugli argomenti passati. Se ciò è importante, usa il sovraccarico.
Se è possibile fornire valori decimali default per i parametri e questi non influiscono sul corretto funzionamento del codice, utilizzare i parametri predefiniti.

Vedere here per una discussione su SO.

2

Al compilatore non interessa quale di questi usi. Immagina di averlo scritto come due costruttori, e hanno finito per circa 20 righe. Inoltre immaginare che 19 delle linee erano identici, e la linea diversa lettura

foo = 0; 

in una versione e

foo = optional; 

nell'altra. In questa situazione, l'utilizzo di un parametro opzionale rende il codice molto più leggibile e comprensibile. In un'altra lingua, che non aveva parametri opzionali, dovresti implementare questo facendo sì che la versione a un parametro chiamasse la versione a due parametri e passasse a zero come secondo parametro.

Ora immagina una coppia diversa di costruttori o funzioni che di nuovo sono lunghe circa 20 righe ma sono completamente diverse. Ad esempio, il secondo parametro è un ID e, se viene fornito, si cerca qualcosa nel database e, se non lo è, si impostano i valori su nullptr, 0 e così via. Si potrebbe avere un valore di default (-1 è famoso per questo), ma poi il corpo della funzione sarebbe pieno di

if (ID == -1) 
{ 
    foo = 0; 
} 
else 
{ 
    foo = DbLookup(ID); 
} 

che potrebbe essere difficile da leggere e renderebbe la funzione singolo molto più a lungo rispetto alle due funzioni separate. Ho visto funzioni con un gigante if che ha diviso l'intera cosa in due blocchi separati senza codice comune, e ho visto la stessa condizione testata 4 o 5 volte con il progredire del calcolo. Entrambi sono difficili da leggere.

Questo è il concetto di C++.Ci sono molti modi per realizzare molte cose. Ma questi diversi modi hanno scopi diversi e, una volta "ottenute" le sottili differenze, scriverai un codice migliore. In questo caso, "migliore" significa più breve, più veloce (tutti i tempi di esecuzione dei costi di if s) e più espressivo: le persone che lo leggono possono capire rapidamente le tue intenzioni.

11

Ci sono diversi motivi tecnici per preferire un sovraccarico di argomenti di default, sono ben disposte in Google di C++ Style Guide nel Default Arguments section:

puntatori a funzione sono confuse in presenza di argomenti di default, dal momento che la firma della funzione spesso non corrisponde alla firma della chiamata. L'aggiunta di un argomento predefinito a una funzione esistente cambia il suo tipo, , che può causare problemi con il codice che prende il suo indirizzo. L'aggiunta della funzione di sovraccarico evita questi problemi.

e:

parametri di default possono tradursi in un codice più ingombranti dal momento che sono replicato ad ogni chiamata in loco - a differenza di funzioni sovraccaricate, dove "il default" appare solo nella funzione definizione.

Sul lato positivo si dice:

Spesso si ha una funzione che utilizza i valori predefiniti, ma di tanto in tanto si desidera ignorare le impostazioni predefinite. I parametri predefiniti consentono un facile modo di fare questo senza dover definire molte funzioni per le rare eccezioni .

Quindi la tua scelta dipenderà dalla pertinenza dei problemi negativi per la tua applicazione.

+0

Due downvotes e nessun commento? –