Prima di tutto, tutte le definizioni fornite sono corrette in modo sintetico. Se si compilano, sono corretti in termini di sintassi.
Il qualificatore const
sui parametri ha un solo scopo: impedire al corpo della funzione di modificare gli argomenti qualificati const
.
Nel caso specifico del codice di esempio, il metodo Foo::bar
non modifica gli argomenti, pertanto l'uso del qualificatore const
non ha alcun effetto.
Tuttavia, è possibile utilizzare const
per impostazione predefinita in tutti i casi e rimuoverlo solo per le situazioni in cui si desidera consentire le modifiche. Quindi, applicarlo ai parametri di Foo::bar
è una buona idea. Penso che sia una buona pratica, anche se devo ammettere che raramente la uso, a causa del rumore che comporta, il che potrebbe ridurre la leggibilità.
Un'altra cosa da considerare è che per i tipi primitivi, o più precisamente i tipi che non sono puntatori o non contengono puntatori, la modifica di un argomento passato per valore (cioè non per riferimento) non avrà alcun effetto collaterale: parametri di questi tipi agiscono realmente come variabili locali inizializzate (che possono essere utili, ma possono anche essere confuse). Per i puntatori, qualsiasi modifica dei dati puntati colerà nel mondo esterno. Questo è un altro buon motivo per utilizzare il qualificatore const
sia sul puntatore e sulla parte appuntita del tipo.
Tutto sommato, utilizzando il qualificatore const
per quanto possibile contribuirà a rendere il codice meno soggetto a errori, e può anche aiutare il compilatore di ottimizzare il programma risultante.
Usare un riferimento per questo tipo, tuttavia, non deve fare alcun cambiamento significativo, se questi tipi descrivono valori montaggio in un registro CPU (che è generalmente il caso),
Quindi, tutte le tre versioni del metodo dovrebbe riducersi allo stesso codice assembly generato.
Nel caso particolare di tipi di ritorno primitivi, non importa. il valore di ritorno può essere convertito avanti e indietro in uno const
qualificato.
Altri hanno anche menzionato l'interesse del qualificatore const
sulla funzione stessa. Anche se al di fuori della portata della domanda originale, dirò anche che è effettivamente meglio quando possibile (come per Foo::bar
) qualificare una funzione come const
.
+1 funzione membro const (anche se un'aggiunta utile a ciò che l'OP chiedeva). – wmorrison365
"il chiamante potrebbe voler modificare il valore restituito" - anche se avranno bisogno di un 'const_cast' (o cast in stile C) per farlo, dal momento che si tratta di un'espressione rvalore di tipo primitivo. Quindi, anche se non è const, non possono ottenere un riferimento non const con esso senza cast. Non è sicuro che sia qualcosa che * dovremmo * supportare *, ma soprattutto se la funzione restituisce un oggetto 'const' di tipo di classe che in genere non funziona, perché impedisce di spostarsi da esso o chiamare funzioni di membri non-const di esso. –
Un ulteriore dettaglio, se il tipo di ritorno era 'bool', è buono renderlo' const' per evitare l'assegnazione accidentale nelle espressioni condizionali. Questo può essere evitato alzando gli avvisi del compilatore, ma, una volta morso due volte timido. –