Storia della questione:
Il qualificatore const in C++ è stato introdotto per motivi di sicurezza: per contrassegnare quelle funzioni che garantiscono di non modificare lo stato interno dell'oggetto. Nel contesto delle classi, i metodi const sono obbligatori per i progetti in cui è richiesta una rigorosa incapsulazione e protezione da errori accidentali.
Problema:
Se si dimentica di contrassegnare i getter, le funzioni ausiliarie e i metodi di verifica come const, non possono essere chiamati per un oggetto const. Senza metodi const, il compilatore non può prevenire modifiche indesiderate ai dati.
Soluzione:
Aggiungere const alla dichiarazione del metodo della classe dopo la firma (e non prima!). Questo consente di chiamare il metodo sia per oggetti normali che per quelli dichiarati come const, eliminando gli errori di modifica dello stato. All'interno di tale metodo non è possibile modificare i membri della classe (eccetto quelli mutable), è possibile solo la lettura.
Esempio di codice:
class Counter { int value; public: int getValue() const { return value; } // Può essere chiamato per Counter const }; void print(const Counter& c) { std::cout << c.getValue(); }
Caratteristiche principali:
Dove si scrive const nel metodo: prima del valore di ritorno o dopo le parentesi?
Solo dopo le parentesi: int getValue() const; — è un errore scrivere prima del tipo di valore di ritorno (ad esempio, const int get();).
Un metodo const può chiamare metodi non const della classe?
No, un metodo const può chiamare solo altri metodi const, se l'oggetto è const.
Qual è la differenza tra const nel metodo e const nel valore di ritorno?
int get() const (il metodo non modifica lo stato)
const int get(); (il valore di ritorno non può essere modificato, ma il metodo può modificare i dati interni)
Nel classe è stata trascurata la const nel metodo che non modifica lo stato. Non può essere chiamato per un oggetto costante, il che impedisce l'uso della classe negli strumenti di analisi e quando si lavora con API.
Vantaggi:
Svantaggi:
Tutti i getter, controlli e metodi ausiliari sono stati dichiarati con const, i test sono coperti per oggetti const e non const.
Vantaggi:
Svantaggi: