W poniższym C++
programie modyfikowanie statycznego elementu członkowskiego danych z const
funkcji działa poprawnie:
class A
{
public:
static int a; // static data member
void set() const
{
a = 10;
}
};
Ale modyfikowanie niestatycznego elementu członkowskiego danych z const
funkcji nie działa:
class A
{
public:
int a; // non-static data member
void set() const
{
a = 10;
}
};
Dlaczego const
funkcja członkowska może modyfikować składową static
danych?
const
że funkcja składowa obiektu nie może modyfikować tego jednego obiektu . Może modyfikować inne obiekty tej samej klasy lubstatic
dane, które są skojarzone z klasą, a nie jej konkretne wystąpienie. (Lubmutable
członkowie danych, którzy zostali stworzeni jako wyjątek od tej reguły.)Odpowiedzi:
To zasada, to wszystko. I nie bez powodu.
const
Kwalifikator na funkcję członek oznacza, że nie można modyfikować innych niżmutable
innych niżstatic
zmienne składowe klasy.Aby
this
zapewnić pewną racjonalizację, wskaźnik wconst
kwalifikowanej funkcji składowej jestconst
typem ithis
jest nieodłącznie powiązany z wystąpieniem klasy.static
elementy członkowskie nie są powiązane z instancją klasy. Nie potrzebujesz instancji, aby zmodyfikowaćstatic
członka: możesz to zrobić w swoim przypadku, piszącA::a = 10;
.Tak więc, w pierwszym przypadku, myśleć
a = 10;
jako skrót doA::a = 10;
i w drugim przypadku, myśleć o nim jako skrót dlathis->a = 10;
, których nie jest compilable od rodzajuthis
jestconst A*
.źródło
this
wskaźnik, to byłoby typuconst A* const
wconst
„s sprawy.this
jest wartością typu wskaźnika. Wartości wartości nieklasowych nigdy nie są kwalifikowane jako CV.Zgodnie ze standardem C ++ (9.2.3.2 Statyczne elementy składowe danych)
I (9.2.2.1 Ten wskaźnik)
I wreszcie (9.2.2 Niestatyczne funkcje składowe)
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źnikthis
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źnikathis
do modyfikowania elementu członkowskiego danych. Wskaźnik ten rzeczywiście ma typconst A *
wewnątrz funkcji,set
ponieważ funkcja jest zadeklarowana z kwalifikatoremconst
. Jeśli funkcja nie ma kwalifikatora, w tym przypadku element członkowski danych można zmienić.źródło
Chodzi o to, że jeśli funkcja składowa klasy
A
jestconst
, to typthis
jestconst X*
, a tym samym zapobiega zmianie niestatycznych składowych danych (por. Na przykład standard C ++ ):Jeśli
a
jest niestatycznyma=10
składnikiem danych, to jest taki sam jakthis->a = 10
, co nie jest dozwolone, jeśli typthis
jestconst A*
ia
nie został zadeklarowany jakomutable
. Tak więc, ponieważvoid set() const
tworzy typthis
bytuconst A*
, ten dostęp nie jest dozwolony.a
Natomiast jeśli jest statycznym składnikiem danych, to wa=10
ogóle nie obejmujethis
; i dopóki samostatic int a
w sobie nie zostało zadeklarowane jakoconst
, instrukcjaa=10
jest dozwolona.źródło
const
Kwalifikator on a funkcja składowa oznacza, że nie można modyfikowaćnon-mutable
,non-static
członków danych klasy .źródło