Secondo lo standard C ++ (9.2.3.2 membri dati statici)
1 Un membro dati statico non fa parte dei suboggetti di una classe ...
E (9.2.2.1 Il puntatore this)
1 Nel corpo di una funzione membro non statica (9.2.1), la parola chiave this è un'espressione prvalue il cui valore è l'indirizzo dell'oggetto per cui viene chiamata la funzione. Il tipo di questo in una funzione membro di una classe X è X *. Se la funzione membro è dichiarata const, il tipo di questo è const X * , ...
E infine (9.2.2 Funzioni membro non statiche)
3 ... se la ricerca del nome (3.4) risolve il nome nell'espressione id in un membro non statico non di tipo di qualche classe C e se l'espressione id è potenzialmente valutata o C è X o una classe base di X, l'espressione id viene trasformata in un'espressione di accesso ai membri della classe (5.2.5) usando (* this) (9.2.2.1) come espressione postfissa a sinistra di. operatore.
Così in questa definizione di classe
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
il membro di dati statici a
non è un oggetto secondario di un oggetto del tipo di classe e del puntatorethis
non viene utilizzato per accedere al membro di dati statici. Pertanto, qualsiasi funzione membro, costante non statica o non costante o una funzione membro statica può modificare il membro dati perché non è una costante.
In questa definizione di classe
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
il membro dati non statico a
è un oggetto secondario di un oggetto del tipo di classe. Per accedervi in una funzione membro viene utilizzata una sintassi di accesso membro di questa sintassi. Non è possibile utilizzare un puntatore costante this
per modificare il membro dati. E il puntatore this è effettivamente di tipo const A *
all'interno della funzione set
perché la funzione è dichiarata con il qualificatoreconst
. Se la funzione non avesse il qualificatore, in questo caso il membro dati potrebbe essere cambiato.