Warum funktioniert das Aufrufen eines Members so, als wäre es statisch (wenn nicht) in C ++?

7

Nach meinem Verständnis von C ++ ist der folgende Code fehlerhaft.

%Vor%

Test::weird() ruft Test::printNum() auf, wie es eine statische Elementfunktion wäre. % Co_de% greift jedoch auf ein Instanzattribut zu und ist eindeutig nicht statisch. Der Code wird jedoch kompiliert und zur Ausgabe von Test::printNum() ausgeführt.

Mein Compiler ist Apple LLVM Version 7.0.0 (clang-700.1.76)

Was vermisse ich?

    
wsaleem 27.12.2015, 22:23
quelle

2 Antworten

8

Sie können printNum (); anstelle dieses- & gt; printNum (); .

Wenn Sie Klassen erben, verwenden Sie NameOfClass :: printNum (); die printNum () zu verwenden; Sie wollen.

Beispiel:

%Vor%

Also Test :: DruckNum (); ist nur der Aufruf der Methode printNum (); dieser Klasse.

    
Pierre Emmanuel Lallemant 27.12.2015, 22:26
quelle
19
  

Was vermisse ich?

Sie irren sich:

  

Test::weird() ruft Test::printNum() als (statische) Klassenmethode auf.

Es wird nicht als Methode static aufgerufen. Es kann nicht sein, weil es keiner ist.

Innerhalb einer Elementfunktion benötigen Sie keine Objektreferenz oder einen Zeiger (z. B. this ), um eine andere Elementfunktion aufzurufen. So können Sie eines von beiden schreiben:

%Vor%

Der vollständige Name von printNum ist tatsächlich Test::printNum , also können Sie diese auch tun:

%Vor%

Außerhalb einer Elementfunktion ist die zweite Option in beiden Fällen falsch, da die Funktion nicht statisch ist und Sie keine Objektverweise oder Zeiger angegeben haben.

Außerhalb einer Member-Funktion würden Sie auch haben, um Test:: zu schreiben, sonst würde der Compiler nicht wissen, über welche printNum Sie sprechen, aber das selbst tut das nicht erzwinge, dass der Anruf ein "statischer" Anruf ist. Es wird ein statischer Aufruf sein, wenn die Elementfunktion statisch ist; Punkt!

    
quelle

Tags und Links