2009-03-06 9 views
3

Ich habe gehört, es gibt Unterschiede zwischen den Sprachen über die Bedeutung des Schlüsselwortes static, aber ich habe keine gute Liste gefunden, die diese Unterschiede konsolidiert.statisch in verschiedenen Sprachen

Hier ist, was ich weiß, über die Bedeutung von static in C++:

  • Für lokale statische Variablen innerhalb einer Funktion, die Variable beim Start initialisiert wird, und der Wert wird über Funktionsaufrufe gespeichert.
  • Statische Datenelemente werden von allen Instanzen einer Klasse gemeinsam genutzt. Mit anderen Worten, es gibt nur eine Instanz eines statischen Datenelements. Statische Datenelemente müssen im Dateibereich initialisiert werden.
  • Statische Memberfunktionen haben nur Zugriff auf statische Member.
  • Im rekursiven Code hat ein statisches Objekt oder eine Variable in verschiedenen Instanzen eines Codeblocks garantiert denselben Zustand.
  • Statische Objekte und Variablen, die im Dateibereich definiert sind, haben nur interne Verknüpfungen. Keine anderen Dateien dürfen sie benutzen.

Wie funktioniert die Bedeutung von static Änderung in anderen Sprachen?

+0

Statische Locals in C++ werden beim ersten Aufruf initialisiert, nicht beim Start. –

+0

@Iraimbilanja, können Sie mir eine Referenz dafür geben? MSDN scheint etwas anderes zu empfehlen. –

+0

@Iraimbilanja: C & V 6,7 (siehe meine Post unten für die genaue Linie). – dirkgently

Antwort

8

C


  • Das Schlüsselwort entweder das Gestänge oder die Dauer (Lebensdauer) eines Objekts ändern können.
  • Variablen werden immer auf 0 initialisiert
  • Funktionen haben interne Verknüpfung.
  • Wenn in Dateiebene Gültigkeitsbereich deklariert: Variablen interne Bindung und statische Dauer (dh während der gesamten Lebensdauer des Programms besteht)
  • Wenn in Block Gültigkeitsbereich deklariert: Variablen haben keine Verknüpfung aber statische Dauer
  • Es kann mehr Erklärungen der gleichen statischen Variable in einer Übersetzungseinheit. Beachten Sie jedoch, dass sie identisch sein müssen. ZB: auf Dateiebene -umfang:

int a;  // a has external linkage 

static int a; // a now has static linkage 
       // same as if you wrote: static int a = 0; 

//... 

static int b; // static linkage 

extern int b; // extern loses its meaning, b still has internal linkage 

//... 

extern int b; // b has external linkage 

static int b; // error 

//... 

void func() { 
    static int x; // automatic linkage, static duration 
       // same as if you wrote: static int x = 0; 
} 

C++


  • Im Rahmen Dateiebene die Nutzung für beide Variablen und Mitglieder für anonyme veraltet ist Namespaces. Ist nur als Kompatibilität
  • Variablen noch erhalten standardmäßig initialisiert (wie in C) auf 0
  • „6.7 Die Null-Initialisierung (8,5) alle lokalen Objekte mit statischer Speicherdauer (3.7.1) oder Fadenspeicherdauer (3.7.2) durchgeführt wird, bevor eine andere Initialisierung erfolgt [...] "
  • Variablen statische Speicherdauer haben, es sei denn durch einen thread_local Spezifizierer begleitet (von C++ 0x ab)
  • Es kann nur eine Definition sein einer statischen in einer Übersetzungseinheit
  • Mitglied Variablen/Funktionen bedeuten, sie sind Eigenschaften von die Klasse und nicht die Instanzen Rechtliche Zugriffssyntax: Instanz.Eigenschaft oder Klasse :: Eigenschaft
  • Statische Member-Funktionen nur zugreifen können nur statische Membervariablen Kein this Zeiger für solche Funktionen
  • Nicht statische Mitglieder jedoch eventuell vorhandene statische Mitglied
  • auf Dateiebene zugreifen können Objekte haben interne Bindung außer für die Teilnehmer, die einen Klassenbereich
  • Klassen Mitglieder müssen entweder in der Klassendeklaration oder außerhalb explizit über Klassennamen und Bereichsauflösungsoperator
  • this definiert werden in einer statischen Methode kann nicht
  • verwenden

Action


  • Klassenmethoden wie in C++
  • nicht this oder super in einer statischen Methode
  • Zugänglich Namen nur durch Klasse verwenden kann und nicht die Instanznamen
  • Nicht geerbt
  • Abgeleitete Klassen haben jedoch Zugang zu den Basen statischen Eigenschaften
  • Variablen, die sowohl die statischen und const Schlüsselwörter deklariert werden, müssen gleichzeitig initialisiert werden, wie Sie die Konstante

erklären Objektorientiertes Design


  • Das Singleton-Entwurfsmuster wird von vielen als eine glorifizierte statisches Objekt
  • Verwendet in Fabrik-Entwurfsmuster betrachtet

ich viele andere Dinge verpasst haben -. Fühlen Sie sich frei in dem Chip

+0

Chipping in Jahren später: C++ Dateibereich statische Veraltetheit ist nicht mehr. – stan423321

1

In C# bedeutet es ziemlich immer: "bezogen auf einen Typ und nicht auf eine Instanz des Typs".

+0

Java ist der gleiche Weg. – Powerlord

+0

@R Bemrose - naja fast. "statischer Import" fühlt sich nicht gleich an; Es ist sicherlich nicht das "Typ-Äquivalent" eines nicht-statischen Imports, zum Beispiel. –

+0

Aber Erweiterungsmethoden, die immer "auf eine Instanz eines Typs bezogen" sind, können nur in statischen Klassen deklariert werden ... was die schöne Faustregel bricht. – bzlm

1

Python hat den Decorator @staticmethod, der, wenn er auf ein Klassenmitglied angewendet wird, die Methode für die Klasse anstatt für Instanzen verfügbar macht und keine automatischen Argumente an die Methode übergibt. Der @ classmethod-Dekorator führt eine ähnliche Funktion aus, übergibt jedoch die Klasse als erstes Argument, was ihn sehr nützlich macht.

2

In VB.NET ist eine Static Variable genau wie eine lokale C++ - statische Variable.

Es gibt jedoch keine klassenweite Static; Verwenden Sie stattdessen Shared.

1

In C, statischen Flags eine Funktion oder globale Variable als lokal auf die Datei in seiner Lage.

Es ist ein bisschen wie privat in anderen Sprachen. Sorta.

Wenn es sich um eine Funktion handelt, wird die Variable im Datenteil der Binärdatei und nicht zur Laufzeit auf dem Stapel vorbelegt.

1

In VB.NET wird statische Prozedurstufe verwendet, um zu bedeuten, dass die Variable allen Ausführungen der Prozedur zugeordnet ist (sie wird von Anruf zu Anruf beibehalten). Das ist ein bisschen eine obskure Verwendung in einer objektorientierten Anwendung.

Das Gegenstück ist "Shared", was bedeutet, dass die Methode oder das Mitglied die Typenebene ist (Sie benötigen keine Instanz, um darauf zuzugreifen).

4

In Delphi wird das statische Schlüsselwort ausschließlich zum Definieren von Klassenmethoden verwendet. In Delphi Eine normale Klassenmethode kann virtuell deklariert und in einer Unterklasse überschrieben werden. Zusätzlich hat Delphi eine self Variable, ähnlich der diese Zeiger in anderen Sprachen. In einer Klassenmethode verweist die self jedoch auf die Klasse, in der die Methode anstelle einer Instanz aufgerufen wird.

eine Klassenmethode statische bedeutet Deklarieren:

  1. Es ist nicht in einer Unterklasse
  2. außer Kraft gesetzt werden kann es keinen Zeiger

Dies bedeutet eine statische Klassenmethode selbst hat kann nur auf Klassenmitglieder in der Klasse zugreifen, in der sie definiert wurde, während eine normale Klassenmethode auf übergeordnete Klassenmitglieder in abgeleiteten Klassen zugreifen kann.

Es gibt andere informelle Verwendungen von Static in der Delphi-Dokumentation, die sich normalerweise auf eine Feature-Unveränderbarkeit beziehen (ist das ein Wort?). Zum Beispiel ein statisches Array gegen ein dynamisches Array. Alle Instanzmethoden in Delphi sind statisch, sofern nicht anders angegeben.

1

In C# gibt es 3 Möglichkeiten ein statisches Schlüsselwort verwendet werden kann:

  • Auf Klassendefinition, die die Klasse bedeutet, dass nur statische Mitglieder aussetzen und kann nicht
  • Auf einem Klassenelement instanziiert werden, was bedeutet, dass das Mitglied angerufen werden kann, ohne die Klasse instanziieren zu müssen.
  • Auf einem Konstruktor, was bedeutet, dass der statische Konstruktor immer aufgerufen wird, bevor ein statisches Member aufgerufen wird. (Das sind meist Leistungsengpässe und daher nicht zu empfehlen)

Hoffe das hilft.

+0

Vergessen Sie nicht, dass bei der Klassendefinition auch bedeutet, dass die Klasse Erweiterungsmethoden deklarieren kann.Auch "kann aufgerufen werden, ohne die Klasse instanziieren zu müssen" ist eine sehr unorthodoxe Art, sie zu beschreiben. Und auf einem Konstruktor ist nicht das Wichtige, dass es stattdessen ein "Klassenkonstruktor" wird? – bzlm

+0

Wenn Sie eine Klasse mit drei statischen Elementen und einem statischen Konstruktor haben, wird der statische Konstruktor immer vor der Ausführung des statischen Elements aufgerufen, wenn ein Element aufgerufen wird. Dies unterscheidet sich von einem Klassenkonstruktor, da ein Klassenkonstruktor nur aufgerufen wird, wenn die Klasse instanziiert ist. –