Ich habe Simpletron.cpp
, was eine leere Datei ist, eine Simpletron.h
, die eine Simpletron
Klasse deklariert:
Ich habe Simpletron()
in meiner main.cpp aufgerufen:
Die Hauptfunktion läuft einfach ohne Warnung oder Fehler. Warum das? Wie kompiliert das überhaupt, wenn es keine Implementierung gibt, mit der die Headerdatei verknüpft werden könnte?
Diese Zeile:
%Vor% ist ein Funktionsprototyp, der eine Funktion namens s
deklariert, eine Simpletron
zurückgibt und keine Argumente annimmt. Es wird keine Simpletron
-Instanz mit dem Namen s
erstellt.
Nun könnten Sie fragen, warum sich der Linker nicht über die nicht vorhandene Funktion s()
beschweren würde? Nun, da Sie nur s()
deklarieren, aber nie wirklich aufrufen, wird während des Linkens tatsächlich nirgendwo referenziert, so dass Sie keinen Linkfehler erhalten.
Dies ist eine Funktionsdeklaration, keine Objektinstanziierung. Die leere Klammer sagt dem Compiler, dass diese Funktion keine Argumente benötigt und gibt ein Objekt vom Typ Simpletron
nach Wert zurück, so dass keine Konstruktoren aufgerufen werden. Die korrekte Syntax ist ohne die Parameter:
C ++ 11 fügt ein syntaktisches Feature hinzu, das diese Mehrdeutigkeit vermeidet:
%Vor% Dies ist ein klassischer Fall von "vexing parse"; Für den Compiler erstellen Sie keine Variable s
vom Typ Simpletron
, aber Sie deklarieren eine Funktion namens s
, nehmen keine Parameter und geben ein Simpletron
-Objekt zurück.
Dies ergibt sich aus der Tatsache, dass dieser Ausdruck sowohl als Funktionsdeklaration als auch als Variablendeklaration interpretiert werden kann; Da es eine einfache Alternative gibt, um die Variable zu deklarieren (nämlich einfach die Klammern wegzulassen), lautet die Standardvorgabe, dies als Funktionsdeklaration zu interpretieren.
Dadurch wird die Kompilierphase ohne Probleme bestanden (der Compiler muss nicht die Definitionen aller Methoden haben, nur die Deklarationen), und wahrscheinlich gibt der Linker keinen Fehler seit nein Instanz von Simpletron
ist tatsächlich erstellt, so dass es nie wirklich nach der Konstruktordefinition suchen muss (obwohl ich nicht glaube, dass es garantiert ist, keine Fehler zu geben, sollte ein besonders gründliches Compiler / Linker-Paar sein in der Lage sein, Ihnen trotzdem einen Fehler für den fehlenden Konstruktor zu geben).
Tags und Links c++