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?
c++
static
language-lawyer
const-method
Prabhakaran
quelle
quelle
const
statische Elementfunktion für Sie bedeuten?Antworten:
Wenn Sie das
const
Qualifikationsmerkmal auf eine nicht statische Elementfunktion anwenden , wirkt sich dies auf denthis
Zeiger aus. Für eine const-qualifizierte Member-Funktion der KlasseC
ist derthis
Zeiger vom TypC const*
, während für eine Member-Funktion, die nicht const-qualifiziert ist, derthis
Zeiger vom Typ istC*
.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.quelle
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 vonstatic
, die vom Kontext abhängt.C const*
oderconst C*
?Ich stimme Ihrer Frage zu, aber leider ist C ++ so konzipiert. Beispielsweise:
Ab heute wird das
const
im Kontext von betrachtetthis
. In gewisser Weise ist es eng. Es kann breiter gemacht werden, indem diesconst
über denthis
Zeiger hinaus angewendet wird .dh der "vorgeschlagene"
const
, der auch fürstatic
Funktionen gelten kann, wird diestatic
Mitglieder von jeglichen Änderungen abhalten.Wenn im Beispielcode gemacht werden kann,
foo()
kann dieseconst
Funktion in dieser FunktionA::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!quelle
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 implizitenthis
Zeiger. Da eine statischethis
Elementmethode nicht an ein Objekt gebunden ist, muss kein Zeiger erstellt werdenconst
.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.quelle
this
Zeiger. (Außerdem werdenconst
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
quelle
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.
quelle