Heute habe ich ein Problem. Ich brauche eine staticMitgliedsfunktion, constist 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 staticMitgliedsfunktion, constist kein Muss, aber besser. Aber meine Bemühungen waren nicht erfolgreich. Kann jemand sagen warum oder wie?
Antworten:
Wenn Sie das constQualifikationsmerkmal auf eine nicht statische Elementfunktion anwenden , wirkt sich dies auf den thisZeiger aus. Für eine const-qualifizierte Member-Funktion der Klasse Cist der thisZeiger vom Typ C const*, während für eine Member-Funktion, die nicht const-qualifiziert ist, der thisZeiger vom Typ ist C*.
Eine statische Elementfunktion hat keinen thisZeiger (eine solche Funktion wird nicht für eine bestimmte Instanz einer Klasse aufgerufen), daher macht die konstante Qualifizierung einer statischen Elementfunktion keinen Sinn.
constfü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 constim Kontext von betrachtet this. In gewisser Weise ist es eng. Es kann breiter gemacht werden, indem dies constüber den thisZeiger hinaus angewendet wird .
dh der "vorgeschlagene" const, der auch für staticFunktionen gelten kann, wird die staticMitglieder von jeglichen Änderungen abhalten.
Wenn im Beispielcode gemacht werden kann, foo()kann diese constFunktion in dieser Funktion A::snicht 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!
constgilt 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.
constModifikator wird nicht auf Mitgliedsmethoden oder Mitgliedsvariablen angewendet, sondern auf den impliziten thisZeiger. Da eine statische thisElementmethode 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 constObjekte konstant bleiben, aber es kann hier ein Objekt geben, das konstant bleibt.
thisZeiger. (Außerdem werden constObjekte 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.
conststatische Elementfunktion für Sie bedeuten?