De acordo com o padrão C ++ (9.2.3.2 Membros de dados estáticos)
1 Um membro de dados estáticos não faz parte dos subobjetos de uma classe ...
E (9.2.2.1 O indicador this)
1 No corpo de uma função de membro não estática (9.2.1), a palavra-chave this é uma expressão prvalue cujo valor é o endereço do objeto para o qual a função é chamada. O tipo disso em uma função-membro de uma classe X é X *. Se a função de membro for declarada const, o tipo disso é const X * , ...
E, por último (9.2.2 Funções de membro não estáticas)
3 ... se a pesquisa de nome (3.4) resolve o nome na expressão id para um membro não estático de alguma classe C, e se a expressão id é potencialmente avaliada ou C é X ou uma classe base de X, a expressão id é transformada em uma expressão de acesso de membro de classe (5.2.5) usando (* this) (9.2.2.1) como a expressão pós-fixada à esquerda do. operador.
Portanto, nesta definição de classe
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
o membro de dados estáticos a
não é um subobjeto de um objeto do tipo de classe e o ponteiro this
não é usado para acessar o membro de dados estáticos. Portanto, qualquer função de membro, constante não estática ou não constante, ou uma função de membro estática pode alterar o membro de dados porque ele não é uma constante.
Nesta definição de classe
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
o membro de dados não estáticos a
é um subobjeto de um objeto do tipo de classe. Para acessá-lo em uma função de membro, é usada uma sintaxe de acesso de membro desta sintaxe está implícita. Você não pode usar um ponteiro constante this
para modificar o membro de dados. E o ponteiro this realmente tem tipo const A *
dentro da função set
porque a função é declarada com o qualificador const
. Se a função não tivesse o qualificador, neste caso, o membro de dados poderia ser alterado.