C ++ - Warum statische Elementfunktionen nicht mit dem Qualifikationsmerkmal 'const' erstellt werden können

85

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?

Prabhakaran
quelle
1
Was würde eine conststatische Elementfunktion für Sie bedeuten?
GManNickG
2
@GMan Ich meine, dass eine statische Elementfunktion, die keine ihrer Eingaben ändert.
Prabhakaran
11
Dann sollten Ihre Eingaben (Funktionsparameter) nach Wert- oder Konstantenreferenzen erfolgen.
GManNickG
3
Die Konstanz der Argumente der Elementfunktionen wird dadurch ohnehin nicht beeinflusst. Es bedeutet nicht "mach alles const", es bedeutet "mach dieses const".
Onkel Bens
@GMan sagen Sie, dass const zu den Argumenten hinzugefügt werden muss
Prabhakaran

Antworten:

133

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.

James McNellis
quelle
Bedeutet das, dass 'const' nur für Variablen wie int, pointer usw. Ist?
Prabhakaran
@prabhakaran - Mitgliedsfunktionen können auch const qualifiziert werden. James erwähnte es deutlich in seiner Antwort.
Mahesh
Das const-Qualifikationsmerkmal der @ Mahesh Member-Funktion qualifiziert auch nur den 'this-Zeiger', nicht das Ganze. Sie können die globale Variable weiterhin innerhalb der const-qualifizierten Member-Funktion ändern. Jetzt habe nur ich das überprüft.
Prabhakaran
5
-1 "Eine statische Elementfunktion hat diesen Zeiger nicht ... daher macht die konstante Qualifizierung einer statischen Elementfunktion keinen Sinn [auf diese Weise]" ist an sich wahr, aber als Antwort auf das "Warum" der Frage falsch ". Als Antwort wird davon ausgegangen, dass die Bedeutung von 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.
Prost und hth. - Alf
2
Ist es C const*oder const C*?
Crisron
23

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!

iammilind
quelle
8
Wahrscheinlich der gleiche Grund wie der Grund, warum Sie eine freie Funktion nicht konstant ändern können, um zu bedeuten, dass "diese Funktion keine globalen Variablen ändert". 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.
Steve Jessop
1
Der 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.
Ruud Althuizen
1

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.

Don Larynx
quelle
2
"kann oder kann nicht"? Eine statische Elementfunktion hat niemals einen 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.)
Ben Voigt
1

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
Raghavendar Reddy
quelle
1

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.

Nihal Dixit
quelle