Comprendo la sintassi e la semantica generale dei puntatori rispetto ai riferimenti, ma come devo decidere quando è più o meno appropriato utilizzare riferimenti o puntatori in un'API?
Naturalmente alcune situazioni hanno bisogno dell'una o dell'altra (ha operator++
bisogno di un argomento di riferimento), ma in generale sto scoprendo che preferisco usare i puntatori (e i puntatori const) poiché la sintassi è chiara che le variabili vengono passate in modo distruttivo.
Ad esempio nel seguente codice:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
Con il puntatore, è sempre (più) ovvio cosa sta succedendo, quindi per le API e simili dove la chiarezza è una grande preoccupazione sono i puntatori non più appropriati dei riferimenti? Significa che i riferimenti dovrebbero essere usati solo quando necessario (ad es. operator++
)? Ci sono problemi di prestazioni con l'uno o l'altro?
MODIFICA (OUTDATED):
Oltre a consentire valori NULL e gestire array grezzi, sembra che la scelta si riduca alle preferenze personali. Ho accettato la risposta che segue che fa riferimento alla Guida allo stile C ++ di Google , in quanto presentano l'opinione che "I riferimenti possono essere fonte di confusione, poiché hanno una sintassi di valore ma una semantica del puntatore".
A causa del lavoro aggiuntivo richiesto per disinfettare gli argomenti del puntatore che non dovrebbero essere NULL (ad es. add_one(0)
Chiamerà la versione del puntatore e si romperà durante il runtime), ha senso dal punto di vista della manutenibilità usare riferimenti in cui un oggetto DEVE essere presente, anche se è un peccato perdere la chiarezza sintattica.
add_one(a);
non è chiaro che a
verrà modificato? Dice proprio nel codice: aggiungine uno .
addOneTo(...)
. Se non è quello che vuoi fare, guarda la dichiarazione.