Für mich sind die Verwendung des Schlüsselworts static
in C und Sprachen wie C # und Java "falsche Freunde" wie "werden" auf Englisch und "bekommen" auf Deutsch (= "bekommen" auf Englisch), weil sie verschiedene Dinge bedeuten.
In C static
bedeutet, dass auf die Funktion oder Variable nur über Funktionen in derselben Quelldatei zugegriffen werden kann, vergleichbar mit private
Funktionen und Elementen in C ++, Java und C #.
In C ++ bedeutet Java und C # static
, dass die Methoden keine Mitglieder einer Klasseninstanz sind, sondern effektiv mehr oder weniger C-Funktionen plus Namespace ähneln.
IMHO sind diese beiden Konzepte sehr unterschiedlich. Warum haben die Designer von C ++ und später Java und C # das static
Schlüsselwort für dieses Verhalten ausgewählt? Gibt es eine logische Verbindung, die ich vermisse?
BEARBEITEN
Ich weiß, dass static
in C die Barrierefreiheit nicht ähnlich wie private
in C ++ geregelt wird, sondern auf diese Weise verwendet werden kann, siehe https://stackoverflow.com/a/1479639/124983
Insbesondere hat C ++ beide Verwendungszwecke
static
, und ich denke, irgendwo gibt es einen dritten.Im Allgemeinen denke ich, dass die C-Verwendung von
static
überhaupt keiner englischen Verwendung des Wortes entspricht, während ich denke, dassstatic
beispielsweise alsstatic
Mitgliedsvariable viel mehr Sinn macht.Denken Sie daran, dass Sie als Sprachdesigner einen fairen Anreiz haben, weniger Schlüsselwörter in die Sprache einzuführen und weniger Code zu verbieten - insbesondere, wenn Sie versuchen, mit C quellkompatibel zu sein, wie in C ++, und das
static
Schlüsselwort bereits vorhanden ist Sie konnten keine C-Programme brechen, die versuchten, als C ++ zu kompilieren, indem sie es wiederverwendeten.Edit: Ich wusste, dass es einen dritten gab. C hat
static
Variablen auf Funktionsebene . Dasstatic
Mitglied ist nur eine Version dieser Funktionalität. Daher stammen beide Verwendungenstatic
von C.quelle
static
, sie ist nur auf eine Klasse anstatt auf eine Funktion beschränkt.static
drei Verwendungszwecke in C (Funktionsumfangsvariable, Kompilierungseinheitsbereich für Variablen, Kompilierungseinheitsbereich für Funktionen). In diesen drei Fällen (Verknüpfung und Lebensdauer) macht es wirklich die gleichen Dinge. Ich teile Ihre Meinung dazu. Die Ansicht von drei statischen Verwendungen in C ist leider häufiger. Es hilft den Menschen zu verstehen, wie man es benutzt, aber nicht, wie es wirklich funktioniert.Hat in C ++
static
die folgenden vier Verwendungszwecke:Globale Funktion (Dateiebene) und Variablendeklarationen : Mit static geben Sie die interne Verknüpfung an . Das bedeutet, dass das Symbol nur in dieser einen Kompilierungseinheit verwendet wird (.cpp / cc / welche Datei auch immer, kein Header). Dies ist, was Sie als "privat" bezeichnen.
Lokale Variablen : Die statische Speicherdauer gibt an, dass die Variable ihren Wert zwischen Funktionsaufrufen beibehalten soll.
Datenelemente : Statische Datenelemente werden von den Instanzen der Klasse gemeinsam genutzt (dh es gibt nur eine Kopie des Mitglieds). Dies ist vergleichbar mit C # und Java Static.
Elementfunktionen : Statische Elementfunktionen sind Elementfunktionen ohne impliziten
this
Zeiger. Sie können ohne Instanz aufgerufen werden. Dies ähnelt auch C # oder Java.Wie Sie sehen können, haben sie zwei der oben genannten Bedeutungen fallen gelassen. Für das Scoping ist es durchaus verständlich, warum: Sowohl C # als auch Java (und sogar C ++) sind dazu auf Namespaces angewiesen. C ++ verfügt wahrscheinlich über die interne Verknüpfungsfunktion, um die Abwärtskompatibilität zu gewährleisten. Das Verzichten auf statische lokale Variablen ist wahrscheinlich zweifach: Ausnahmsweise kann es schwierig sein, die Konsequenzen vollständig zu verstehen, und diese Sprachen zielen auf Einfachheit ab. Zweitens haben sowohl Java als auch C # einen Garbage Collector, der (wie ich mir vorstellen kann) Schwierigkeiten bei der Implementierung eines solchen Verhaltens verursacht.
quelle
static
(bevorzugt anonyme Namespaces) zuerst ablehnte und dann in seiner aktuellen Inkarnation C ++ 11 die Verwendung vonstatic
dies ablehnte . (alle IIRC)C ++ hat es von C übernommen, da C ++ vorhandene Schlüsselwörter gerne wiederverwendet, anstatt neue einzuführen, um das Brechen vorhandenen Codes zu minimieren.
Java und C # haben es dann aus C ++ übernommen.
quelle
C
static
regelt nicht die Zugänglichkeit und ist nicht analog zuprivate
der von Ihnen vorgeschlagenen Art und Weise.Im Dateibereich regelt es die Verfügbarkeit des Namens (Linkersymbol), nicht der Sache - Sie können einen Zeiger auf eine
static
Funktion oder eine globale Funktion von der Übersetzungseinheit übergeben, in der der Code in einer anderen Datei definiert ist, und er funktioniert einwandfrei.Die C ++ - Methode (wie DeadMG sagt, ist die C-Methode auch noch verfügbar) besteht darin, einen anonymen Namespace zu verwenden.
Im Funktionsumfang ersetzt es im Wesentlichen die lokale Variable durch eine globale Variable, auf die nur innerhalb dieser Funktion zugegriffen werden kann (wieder mit Namen!) - dies ist in C ++ identisch (es gibt also keine C ++ y- Methode). .
Warum C ++ das
static
Qualifikationsmerkmal für Klassenmitglieder verwendet hat; Es ist wahrscheinlich richtig zu sagen, dass dies dazu dient, die Anzahl der neu eingeführten Schlüsselwörter zu minimieren. (Beachten Sie die kürzlich erfolgte Wiederverwendung von Auto zum Vergleich).Das statische Aufrufen von Daten pro Klasse (so implizit sind Daten pro Instanz dynamisch ) erscheint mir ziemlich intuitiv, aber da ich mich nicht an den Prozess der Bildung dieser Intuition erinnere, kann ich nicht objektiv kommentieren, ob es beim Start sinnvoll war aus.
quelle