Im folgenden C++
Programm funktioniert das Ändern eines statischen Datenelements aus einer const
Funktion einwandfrei:
class A
{
public:
static int a; // static data member
void set() const
{
a = 10;
}
};
Das Ändern eines nicht statischen Datenelements aus einer const
Funktion funktioniert jedoch nicht:
class A
{
public:
int a; // non-static data member
void set() const
{
a = 10;
}
};
Warum kann eine const
Mitgliedsfunktion ein static
Datenelement ändern ?
const
eine Elementfunktion eines Objekts dieses eine Objekt nicht ändern kann . Es kann andere Objekte derselben Klasse oderstatic
Daten, die der Klasse zugeordnet sind, ändern , nicht eine bestimmte Instanz davon. (Odermutable
Datenelemente, die als Ausnahme von dieser Regel erstellt wurden.)Antworten:
Es ist die Regel, das ist alles. Und das aus gutem Grund.
Das
const
Qualifikationsmerkmal für eine Mitgliedsfunktion bedeutet, dass Sie keinemutable
Nicht-static
Klassen-Mitgliedsvariablen ändern können.Um eine gewisse Rationalisierung zu ermöglichen, ist der
this
Zeiger in einerconst
qualifizierten Elementfunktion einconst
Typ undthis
inhärent mit einer Instanz einer Klasse verbunden.static
Mitglieder sind nicht mit einer Klasseninstanz verbunden. Sie benötigen keine Instanz, um einstatic
Mitglied zu ändern. Sie können dies in Ihrem Fall durch Schreiben tunA::a = 10;
.Stellen Sie sich in Ihrem ersten Fall eine
a = 10;
Abkürzung fürA::a = 10;
und im zweiten Fall eine Abkürzung für vorthis->a = 10;
, die nicht kompilierbar ist, da die Art vonthis
istconst A*
.quelle
this
Zeiger, wäre es der Typ sein ,const A* const
inconst
s Fall‘.this
ist ein Wert vom Zeigertyp. Werte von Nicht-Klassentypen sind niemals lebenslaufqualifiziert.Gemäß dem C ++ Standard (9.2.3.2 Statische Datenelemente)
Und (9.2.2.1 Der dieser Zeiger)
Und endlich (9.2.2 Nicht statische Elementfunktionen)
Also in dieser Klassendefinition
Das statische Datenelement
a
ist kein Unterobjekt eines Objekts vom Klassentyp, und der Zeigerthis
wird 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
Das nicht statische Datenelement
a
ist 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 verwendenthis
, um das Datenelement zu ändern. Und der Zeiger, den dies ist, hat tatsächlich einen Typconst A *
innerhalb der Funktion,set
da die Funktion mit dem Qualifizierer deklariert wirdconst
. Wenn die Funktion in diesem Fall kein Qualifikationsmerkmal hätte, könnte das Datenelement geändert werden.quelle
Die Sache ist, dass, wenn eine Elementfunktion einer Klasse
A
istconst
, der Typ vonthis
istconst X*
und dadurch verhindert wird , dass nicht statische Datenelemente geändert werden (siehe z. B. C ++ - Standard ):Wenn
a
es sich um ein nicht statisches Datenelement handelt,a=10
ist es dasselbe wiethis->a = 10
, was nicht zulässig ist, wenn der Typ vonthis
istconst A*
unda
nicht als deklariert wurdemutable
. Daher ist dieser Zugriff nicht erlaubt , da ervoid set() const
die Art desthis
Seins machtconst A*
.Wenn
a
es sich dagegen um ein statisches Datenelement handelt, handelt es sicha=10
überhaupt nicht darumthis
. und solangestatic int a
an sich nicht als deklariert wurdeconst
,a=10
ist eine Aussage erlaubt.quelle
Die
const
Qualifier auf einem Member - Funktion bedeutet , dass Sie nicht ändern könnennon-mutable
,non-static
Klasse Datenelemente .quelle