La parola chiave const
, che abbiamo già incontrato in precedenza, quando viene applicata alla firma di una funzione membro ha l'effetto di inibire la modifica di un qualsiasi membro di classe. Ogni tentativo di assegnamento di un nuovo valore genererà infatti un errore di compilazione in C++.
Come esempio pratico, prendiamo il caso dei metodi per l'accesso a membri privati o protetti della classe che solitamente vengono decorati con la parola const
proprio per sottolineare e garantire che non vi siano effetti collaterali. Il listato successivo mostra l'applicazione di questa clausola alla classe Point2D, che abbiamo introdotto nelle lezioni precedenti:
// point2d.h
class Geometry::Point2D
{
public:
...
double X() const;
double Y() const;
...
private:
double x;
double y;
};
// point2d.cpp
...
double Geometry::Point2D::X() const {
return x;
}
double Geometry::Point2D::Y() const {
return y;
}
...
Questa clausola garantisce nel contesto del chiamante che l'invocazione di tale metodo non causerà modifiche sull'istanza che la invoca. La sua importanza non è solo pratica, ma anche concettuale. L'uso corretto di questa clausola consente infatti di far valere dei vincoli progettuali sul nostro modello di dati.
Basta infatti una singola istruzione innocentemente fuori posto per invalidare il funzionamento di una classe. La parola chiave const
, se applicata con criterio alla definizione di un metodo, può prevenire il mancato rispetto di un vincolo progettuale già in fase di compilazione, o indurci a riconsiderare il nostro modello di dati.