Heim > Artikel > Backend-Entwicklung > Können Sie eine statische Member-Methode für eine Klasseninstanz in C aufrufen?
In C werden statische Member-Methoden normalerweise über den Klassennamen selbst und nicht über eine Instanz der Klasse aufgerufen. Es stellt sich jedoch die Frage: Können statische Mitgliedsmethoden für Klasseninstanzen aufgerufen werden?
Das angegebene Codefragment zeigt ein faszinierendes Verhalten:
class Test { public: static void DoCrash(){ std::cout << "TEST IT!" << std::endl; } }; int main() { Test k; k.DoCrash(); // calling a static method like a member method... }
In Visual Studio 2008 SP1 wurde dieser Code erfolgreich ausgeführt kompiliert und gibt „TEST IT!“ aus. Entgegen der üblichen Erwartung wird scheinbar eine statische Methode auf einer Instanz der Klasse aufgerufen.
1. Liegen Sie falsch? Ist der Code korrekt?
Basierend auf dem C-Standard ist der Aufruf einer statischen Member-Methode für eine Instanz nicht falsch. Im Standard heißt es in 9.4 (Statische Mitglieder) ausdrücklich:
„Auf ein statisches Mitglied der Klasse (5.2.5), um auf ein statisches Mitglied zu verweisen.“
Mit anderen Worten: Es ist nicht erforderlich, den Klassennamen zu verwenden, um auf statische Mitglieder zuzugreifen. Die Zugriffssyntax für Klassenmitglieder ist zulässig, in diesem Fall wird jedoch der Objektausdruck ausgewertet.
2. Warum ist das zulässig?
Der Standard ermöglicht den Aufruf statischer Mitglieder auf Instanzen, um die Verwendung von „statischen oder nicht“-Methoden in Vorlagen zu erleichtern. Vorlagen erfordern häufig die Möglichkeit, eine Funktion aufzurufen, ohne zu wissen, ob sie statisch ist oder nicht. Indem der Compiler den Aufruf statischer Member auf Instanzen zulässt, kann er immer die richtige aufzurufende Funktion bestimmen, unabhängig von ihrem statischen Status.
Das obige ist der detaillierte Inhalt vonKönnen Sie eine statische Member-Methode für eine Klasseninstanz in C aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!