Io uso regolarmente const
quando lavoro con strutture dati in memoria e mantengo il mio codice costante, ma non sono sicuro di come const
debba applicarsi a oggetti più complessi, come il seguente:semantica const per accesso al database o al filesystem
- oggetti che rappresentano connessioni a sistemi remoti
- oggetti supportati da un database (che possono caricare parti dal database su richiesta)
- oggetti supportati da un albero di directory su disco (con accesso alla struttura di directory controllato da una gerarchia di oggetti separata)
Cosa devono significare i metodi const
per oggetti come questi? Mi viene in mente un paio di possibilità:
- "severe" Const - I metodi che non modificano qualsiasi stato in memoria sono const. Tuttavia, ciò sembrerebbe interrompere l'incapsulamento, poiché richiederebbe ai chiamanti di sapere quali metodi modificano lo stato della connessione e quali no.
- "logico" const - I metodi che non modificano lo stato logico dell'oggetto sono const. Tuttavia, questo potrebbe richiedere la marcatura di molte variabili di stato e di memorizzazione nella cache come
mutable
. Anche se mi rendo conto che è quello per cui è stato progettato lo standardmutable
, utilizzarlo sembra un trucco. Inoltre, dato che const significa "Prometto di non modificare questo", non sembra giusto applicarlo quando i metodi possono modificare lo stato della connessione in modi strani e meravigliosi (purché mantengano l'incapsulamento), i risultati della cache come tanto quanto vogliono, lanciare eccezioni se la connessione fallisce, ecc. - No const - Alla luce dei problemi precedenti, const semplicemente non ha molto significato per oggetti più complicati?
Quale approccio è più utile? Qual è il più comune?
Questo sembra correlato a una domanda che ho chiesto qualche tempo fa: http://stackoverflow.com/questions/5208184/should-member-functions-be-const-if-the-affect-logical-state-but-not -bitwise. –
Anche http://stackoverflow.com/questions/98705/what-are-the-semantics-of-a-const-member-function –
Soggettivo, ma direi che se si dispone di un oggetto di connessione al database, vorrei avere 'const' riferirsi ai parametri della connessione: ricollegamento, chiusura, ecc. dovrebbero essere le operazioni di muting. L'esecuzione di una query, d'altra parte, potrebbe essere 'const'. Quindi i riferimenti cost all'oggetto possono eseguire query ma non chiudere la connessione. (Ovviamente la connessione potrebbe sempre essere chiusa dall'altra parte.) –