2012-11-23 6 views
18

Hier ist ein minimales Arbeitsbeispiel:Warum ist eine statische Member-Funktion _declared_ statisch, aber _defined_ sonst in C++?

Ah:

class A{ 
     static int a_member_function(); 
}; 

A.cpp

#include "A.h" 
int A::a_member_function(){return 5;} 


int main(){ return 1;} 

Dieser Code kompiliert und ausgeführt, aber es scheint mir, dass:

static int A::a_member_function(){return 5;} 

könnte ebenso einfach verwendet werden, um die statische Elementfunktion von c zu definieren Lass A. Tatsächlich scheint es, als könnte es tatsächlich ziemlich nützlich sein, diese Anforderung zu haben, da es den Leser an die .cpp-Datei erinnern würde, dass a_member_function statisch ist.

Doch dies funktioniert offenbar nicht:

error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive] 

So warum funktioniert es nicht? Was ist der Grund für diese Entscheidung?

Antwort

23

Der Grund dafür ist C++ Geist zu versuchen, die Anzahl der Schlüsselwörter zu minimieren und Abwärtskompatibilität mit C: static in dieser Position hat eine ganz andere Bedeutung.

Es geht alles zurück auf C. "Statische" Funktionen in C sind Funktionen, die für eine Kompilierungseinheit (eine .c-Datei) einzigartig sind. Auf sie kann nicht von anderen Kompilierungseinheiten zugegriffen werden (es ist eine Möglichkeit, eine Kapselung in C zu haben). Diese Verwendung ist in C++ immer noch gültig. Sie können das Gleiche auch für globale Variablen tun, um deren Gültigkeitsbereich zu begrenzen. In C++ möchten Sie Memberfunktionen auch als static aus einem anderen Grund deklarieren: Diese Funktionen gehören zur Klasse, aber sie benötigen keine Instanz dieser Klasse (ich wette, das wissen Sie bereits, ich versuche es nur.) vollständig sein).

Die Definition einer Elementfunktion als static würde zu einem Widerspruch führen: Auf diese Funktion muss außerhalb ihrer Übersetzungseinheit zugegriffen werden.

Es gibt einen weiteren Fall der Schlüsselwortwiederverwendung zwischen C und C++, das Schlüsselwort auto in C++ 11, aber es ist weniger wahrscheinlich, ein Problem zu sein.

Hinweis: Die gleiche Sache mit dem virtual Stichwort geschieht, die in der Erklärung vorhanden ist und nicht die Definition.

+0

Ah. Macht irgendwie Sinn. Vielen Dank! –