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 anon è 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 thisper modificare il membro dati. E il puntatore this è effettivamente di tipo const A *all'interno della funzione setperché la funzione è dichiarata con il qualificatoreconst . Se la funzione non avesse il qualificatore, in questo caso il membro dati potrebbe essere cambiato.