Gemäß dem C ++ Standard (9.2.3.2 Statische Datenelemente)
1 Ein statisches Datenelement ist nicht Teil der Unterobjekte einer Klasse ...
Und (9.2.2.1 Der dieser Zeiger)
1 Im Hauptteil einer nicht statischen (9.2.1) Elementfunktion ist das Schlüsselwort this ein prvalue-Ausdruck, dessen Wert die Adresse des Objekts ist, für das die Funktion aufgerufen wird. Der Typ in einer Mitgliedsfunktion einer Klasse X ist X *. Wenn die Elementfunktion als const deklariert ist, lautet der Typ const X * , ...
Und endlich (9.2.2 Nicht statische Elementfunktionen)
3 ... wenn die Namenssuche (3.4) den Namen im ID-Ausdruck in ein nicht statisches Nicht-Typ-Mitglied einer Klasse C auflöst und wenn entweder der ID-Ausdruck möglicherweise ausgewertet wird oder C X oder eine Basisklasse ist von X wird der ID-Ausdruck in einen Klassenmitgliedszugriffsausdruck (5.2.5) umgewandelt, wobei (* this) (9.2.2.1) als Postfix-Ausdruck links vom verwendet wird. Operator.
Also in dieser Klassendefinition
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
Das statische Datenelement aist kein Unterobjekt eines Objekts vom Klassentyp, und der Zeiger thiswird nicht für den Zugriff auf das statische Datenelement verwendet. Daher kann jede Elementfunktion, nicht statische Konstante oder Nichtkonstante oder eine statische Elementfunktion das Datenelement ändern, da es keine Konstante ist.
In dieser Klassendefinition
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
Das nicht statische Datenelement aist ein Unterobjekt eines Objekts vom Klassentyp. Um in einer Mitgliedsfunktion darauf zuzugreifen, wird entweder eine Mitgliedszugriffssyntax dieser Syntax impliziert. Sie dürfen keinen konstanten Zeiger verwenden this, um das Datenelement zu ändern. Und der Zeiger, den dies ist, hat tatsächlich einen Typ const A *innerhalb der Funktion, setda die Funktion mit dem Qualifizierer deklariert wird const. Wenn die Funktion in diesem Fall kein Qualifikationsmerkmal hätte, könnte das Datenelement geändert werden.