it-swarm.com.de

Warum dürfen statische Memberfunktionsdefinitionen nicht das Schlüsselwort 'static' enthalten?

Laut this link auf dem Schlüsselwort 'static' in C++:

Das Schlüsselwort static wird nur mit der Deklaration eines statischen Members innerhalb der Klassendefinition verwendet, aber nicht mit der Definition dieses statischen Members .

Warum ist das Schlüsselwort static in Memberfunktionsdefinitionen nicht zulässig? Ich verstehe, dass die Neudeklaration einer Funktion als "statisch" bei ihrer Definition überflüssig ist. Die Verwendung sollte jedoch bei der Erstellung der Funktionsdefinition unbedenklich sein, da dadurch keinerlei Mehrdeutigkeiten entstehen. Warum verbieten Compiler das?

16
johngreen

Mehrdeutigkeit ist in Ordnung. Die gleiche Definition muss überhaupt nicht für eine Member-Funktion sein.

Bedenken Sie:

namespace foo {
    static void bar();
}

static void foo::bar() {

}

foo::bar ist erforderlich muss mit demselben Verknüpfungsspezifizierer definiert werden.

Für Elementfunktionen ist static jedoch kein Verbindungsbezeichner. Wenn dies zulässig war, ist die Richtigkeit der Definition von foo::bar sehr sehr context abhängig davon, was foo ist. Indem Sie static nicht zulassen, wird der Compiler entlastet.

Die Erweiterung auf Mitglieder im Allgemeinen und nicht nur auf Mitgliederfunktionen ist eine Frage der Konsistenz.

17
StoryTeller

Der Punkt ist, dass static verschiedene, sehr unterschiedliche Bedeutungen hat:

class Foo {
    static void bar();
}

Das Schlüsselwort static bedeutet hier, dass die Funktion bar der Klasse Foo zugeordnet ist, aber nicht in einer Instanz von Foo aufgerufen wird. Diese Bedeutung von static hängt stark mit der Objektorientierung zusammen. Die Erklärung jedoch

static void bar();

bedeutet etwas ganz anderes: Dies bedeutet, dass bar nur im Dateibereich sichtbar ist. Die Funktion kann nicht direkt von anderen Übersetzungseinheiten aufgerufen werden.

Wenn Sie in der Klassendeklaration static sagen, macht es keinen Sinn, die Funktion später auf den Dateibereich zu beschränken. Wenn Sie über eine static-Funktion (mit Dateibereich) verfügen, ist es nicht sinnvoll, sie als Teil einer Klassendefinition in einer öffentlichen Header-Datei zu veröffentlichen. Die zwei Bedeutungen sind so verschieden, dass sie sich praktisch ausschließen.


static hat noch mehr eindeutige Bedeutungen:

void bar() {
    static int hiddenGlobal = 42;
}

ist eine andere Bedeutung, die ähnlich ist, aber nicht identisch ist mit

class Foo {
    static int classGlobal = 6*7;
}

Bei der Programmierung haben Wörter nicht immer die gleiche Bedeutung in allen Zusammenhängen.

3
cmaster

Sie müssen den Unterschied zwischen Deklaration und Implementierung verstehen und das wird Ihre Frage beantworten:

Deklaration: Gibt an, wie C++ - Funktionen und -Methoden vor dem Kompilieren des Programms betrachtet werden. Es befindet sich in einer Header-Datei (.h-Datei).

Implementierung: Verknüpft der Compiler eine Deklaration mit einer echten Task im Binärcode. Die Implementierung kann spontan (aus Quelldateien, .cpp oder .cxx oder .cc) oder bereits kompiliert werden (aus gemeinsam genutzten Bibliotheken oder Objektdateien).

Wenn Sie nun zu Ihrer Frage zurückkehren, wenn Sie etwas als statisch deklarieren, hat dies nichts mit der Implementierung zu tun, sondern darauf, wie der Compiler die Deklaration beim Kompilieren des Codes sieht. Wenn Sie beispielsweise Funktionen in Quelldateien als "statisch" kennzeichnen, ist dies bedeutungslos, da diese Informationen nicht in kompilierte Objekte und gemeinsam genutzte Bibliotheken übertragen werden können. Warum das zulassen? Im Gegenteil, es könnte nur zu Mehrdeutigkeiten führen.

Aus demselben Grund müssen Standardparameter in den Header eingegeben werden, nicht in die Quelldateien. Da Quelldateien (die Implementierungen enthalten) die Standardparameterinformationen nicht zu einem kompilierten Objekt übertragen können.

Wilde Vermutung, aber wenn die Definition statisch ist, könnte sie als eine Datei-Gültigkeitsvariable im C-Sinn interpretiert werden. 

0
virgesmith