Zgodnie ze standardem C ++ (9.2.3.2 Statyczne elementy składowe danych)
1 Statyczny element członkowski danych nie jest częścią podobiektów klasy ...
I (9.2.2.1 Ten wskaźnik)
1 W treści niestatycznej funkcji składowej (9.2.1) słowo kluczowe this jest wyrażeniem prvalue, którego wartością jest adres obiektu, dla którego funkcja jest wywoływana. Typ this w funkcji składowej klasy X to X *. Jeśli funkcja składowa jest zadeklarowana jako const, typ tego to const X * , ...
I wreszcie (9.2.2 Niestatyczne funkcje składowe)
3 ... jeśli wyszukiwanie nazw (3.4) rozwiązuje nazwę w wyrażeniu id na niestatyczną składową niebędącą typem jakiejś klasy C, i jeśli albo wyrażenie id jest potencjalnie oceniane, albo C jest X lub klasą bazową X, wyrażenie id jest przekształcane w wyrażenie dostępu do składowej klasy (5.2.5) przy użyciu (* this) (9.2.2.1) jako wyrażenia postfiksowego po lewej stronie. operator.
Tak więc w tej definicji klasy
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
statyczny element członkowski danych a
nie jest podobiektem obiektu typu klasy, a wskaźnik this
nie jest używany do uzyskania dostępu do statycznego elementu członkowskiego. Tak więc każda funkcja składowa, niestatyczna stała lub zmienna lub statyczna funkcja członkowska może zmienić element członkowski danych, ponieważ nie jest stałą.
W tej definicji klasy
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
niestatyczny element członkowski danych a
jest podobiektem obiektu typu klasy. Aby uzyskać do niego dostęp w funkcji składowej, używana jest składnia dostępu do elementów składowych o tej składni. Nie można używać stałego wskaźnika this
do modyfikowania elementu członkowskiego danych. Wskaźnik ten rzeczywiście ma typ const A *
wewnątrz funkcji, set
ponieważ funkcja jest zadeklarowana z kwalifikatorem const
. Jeśli funkcja nie ma kwalifikatora, w tym przypadku element członkowski danych można zmienić.