Heute habe ich ein Problem. Ich brauche eine static
Mitgliedsfunktion, const
ist kein Muss, aber besser. Aber meine Bemühungen waren nicht erfolgreich. Kann jemand sagen warum oder wie?
Heute habe ich ein Problem. Ich brauche eine static
Mitgliedsfunktion, const
ist kein Muss, aber besser. Aber meine Bemühungen waren nicht erfolgreich. Kann jemand sagen warum oder wie?
Antworten:
Wenn Sie das const
Qualifikationsmerkmal auf eine nicht statische Elementfunktion anwenden , wirkt sich dies auf den this
Zeiger aus. Für eine const-qualifizierte Member-Funktion der Klasse C
ist der this
Zeiger vom Typ C const*
, während für eine Member-Funktion, die nicht const-qualifiziert ist, der this
Zeiger vom Typ ist C*
.
Eine statische Elementfunktion hat keinen this
Zeiger (eine solche Funktion wird nicht für eine bestimmte Instanz einer Klasse aufgerufen), daher macht die konstante Qualifizierung einer statischen Elementfunktion keinen Sinn.
const
für ein statisches Element dieselbe sein muss wie für ein nicht statisches. Betrachten Sie als Beispiel, dass dieses Denken nicht gilt, die Bedeutung von static
, die vom Kontext abhängt.
C const*
oder const C*
?
Ich stimme Ihrer Frage zu, aber leider ist C ++ so konzipiert. Beispielsweise:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
Ab heute wird das const
im Kontext von betrachtet this
. In gewisser Weise ist es eng. Es kann breiter gemacht werden, indem dies const
über den this
Zeiger hinaus angewendet wird .
dh der "vorgeschlagene" const
, der auch für static
Funktionen gelten kann, wird die static
Mitglieder von jeglichen Änderungen abhalten.
Wenn im Beispielcode gemacht werden kann, foo()
kann diese const
Funktion in dieser Funktion A::s
nicht geändert werden. Ich kann keine sprachlichen Nebenwirkungen sehen, wenn diese Regel zum Standard hinzugefügt wird. Im Gegenteil, es ist amüsant, warum es eine solche Regel nicht gibt!
const
gilt für ein Objekt (im Fall von const-Member-Funktionen die Instanz, auf der es aufgerufen wird). Sie möchten, dass es für alle statischen Mitglieder der Klasse gilt. Ich denke, wenn es vom Komitee überhaupt berücksichtigt wurde, wurde es nicht als häufig genug angesehen, um es zu unterstützen.
const
Modifikator wird nicht auf Mitgliedsmethoden oder Mitgliedsvariablen angewendet, sondern auf den impliziten this
Zeiger. Da eine statische this
Elementmethode nicht an ein Objekt gebunden ist, muss kein Zeiger erstellt werden const
.
Ohne auf die Details einzugehen, liegt es daran, dass möglicherweise ein Objekt von der Funktion geändert wurde oder nicht, sodass const für den Compiler nicht eindeutig ist.
Denken Sie daran, dass const
Objekte konstant bleiben, aber es kann hier ein Objekt geben, das konstant bleibt.
this
Zeiger. (Außerdem werden const
Objekte nicht konstant gehalten. Es wird verhindert, dass ein bestimmter Zeiger oder eine bestimmte Referenz zum Ändern des Objekts verwendet wird, die Änderung kann jedoch weiterhin über einen anderen Pfad erfolgen.)
Es ist bedauerlich, dass C ++ es nicht gemäß Design akzeptiert, aber logischerweise gibt es nur wenige Anwendungsfälle, in denen es gut validiert wird.
Eine Funktion, die auf Klassenebene gültig (statisch) ist, ändert möglicherweise keine statischen Daten. Möglicherweise werden nur Daten abgefragt, die const sein sollten. Vielleicht sollte es so sein
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
Eine 'const-Member-Funktion' darf das aufgerufene Objekt nicht ändern, statische Member-Funktionen werden jedoch für kein Objekt aufgerufen. Es wird direkt vom Bereichsauflösungsoperator verwendet. Daher macht es keinen Sinn, eine konstante statische Elementfunktion zu haben, daher ist sie illegal.
const
statische Elementfunktion für Sie bedeuten?