Frage

Ich habe gehört, es gibt Unterschiede zwischen den Sprachen über die Bedeutung des Schlüsselworts static , aber ich habe nicht eine gute Liste gefunden, die diese Unterschiede konsolidieren.

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

  • Für die lokale statische Variablen innerhalb einer Funktion, die Variable beim Start und der Wert initialisiert wird, wird über Funktionsaufrufe gespeichert.
  • Statische Datenelemente werden von allen Instanzen einer Klasse geteilt. Mit anderen Worten, es gibt nur eine Instanz eines statischen Datenelementes. Statische Datenelemente müssen in Dateigültigkeitsbereich initialisiert werden.
  • Statische Member-Funktionen haben nur Zugriff auf statische Elemente.
  • In rekursiven Code ein statisches Objekt oder eine Variable ist garantiert den gleichen Zustand in verschiedenen Instanzen eines Blocks von Code haben.
  • Statische Objekte und Variablen in Dateigültigkeitsbereich definiert haben nur interne Bindung. Keine andere Dateien können sie verwenden.

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

War es hilfreich?

Lösung

C


  • Das Schlüsselwort kann entweder die Verknüpfung ändern oder die Dauer (Lebensdauer) eines Objekts.
  • Variablen werden immer initialisiert auf 0
  • Funktionen haben interne Bindung.
  • Wenn in Dateiebene Gültigkeitsbereich deklariert: Variablen haben interne Bindung und statische Dauer (d existiert während der gesamten Lebensdauer des Programms)
  • Wenn in Block Gültigkeitsbereich deklariert: Variablen haben keine Verknüpfung aber statische Dauer
  • Es können mehrere Erklärungen der gleichen statischen Variablen in einer Übersetzungseinheit. Beachten Sie jedoch, dass sie gleich sein müssen. Z. B: 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 ++


  • Auf Dateiebene Umfang der Nutzung für beide Variablen und Mitglieder für anonymen Namensräume ist veraltet. Ist nur als Kompatibilität
  • Variablen noch initialisiert Get Default (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 haben statische Speicherdauer, es sei denn durch einen thread_local Spezifizierer begleitet (von C ++ 0x ab)
  • Es kann nur eine Definition eines statischen in einer Übersetzungseinheit
  • sein
  • Das Mitglied Variablen / Funktionen bedeuten, dass sie die Eigenschaften der Klasse und nicht die Instanzen Legal Zugang Syntax: instance.property oder Class :: Eigenschaft
  • Statische Member-Funktionen können nur Zugriff auf nur statische Membervariablen Kein this Zeiger für solche Funktionen
  • Non-statische Mitglieder jedoch kann jedes statisches Element zugreifen
  • Auf Dateiebene Objekte haben interne Bindung mit Ausnahme der Klasse Mitglieder, die einen Klassenbereich haben
  • Die Schüler müssen entweder in der Klassendeklaration oder außerhalb explizit über Klassennamen und Bereichsauflösungsoperator
  • definiert werden
  • Kann nicht this in einer statischen Methode verwenden

Actionscript


  • Klassenmethoden wie in C ++
  • kann nicht this oder super in einer statischen Methode verwenden
  • Zugänglich nur durch Klassennamen und nicht Instanzname
  • Nicht geerbt
  • Abgeleitete Klassen haben jedoch Zugang zu den Basen statische Eigenschaften
  • Variablen, die sowohl mit den statischen und const Schlüsselwort deklariert werden, muß gleichzeitig initialisiert werden, wie Sie die Konstante
  • erklären

Object Oriented Design


  • Das Muster Singleton Design von vielen als ein glorifizierte statischen Objekt betrachtet wird
  • Wird in der Fabrik-Entwurfsmuster

Vielleicht habe ich eine Menge anderer Dinge verpasst -. Fühlen Sie sich frei in dem Chip

Andere Tipps

In Delphi das statische Schlüsselwort wird ausschließlich für die Definition von Klassenmethoden verwendet. In Delphi a normalen Klassenmethode kann in einer Unterklasse deklariert virtuelle und außer Kraft gesetzt werden. Zusätzlich Delphi hat einen self Variable, ähnlich die diese Zeiger in anderen Sprachen. Jedoch in einer Klassenmethode die self verweist auf die Klasse, in der das Verfahren anstelle einer Instanz aufgerufen wird.

Deklarieren einer Klassenmethode statisch bedeutet:

  1. Es kann nicht in einer Unterklasse überschrieben werden
  2. Es hat keinen self Zeiger

Das bedeutet eine statische Klassenmethode kann nur Mitglieder Zugang Klasse in der Klasse es in definiert wurde, während eine normale Klassenmethode überschriebenen Klasse Mitglieder in abgeleiteten Klassen zugreifen kann.

Es gibt auch andere informelle Nutzung von statischen in der Delphi-Dokumentation in der Regel auf ein Merkmal unchangability Bezug (ist das ein Wort?). Zum Beispiel kann ein statisches Array vs einem dynamischen Array. Alle Instanzmethoden in Delphi sind statisch, sofern nicht anders deklariert.

In VB.NET, eine Static Variable ist wie ein C ++ lokalen statischen Variablen.

Es gibt jedoch keine Klasse weite Static; verwenden Shared statt.

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

  • Ein Klassendefinition, die die Klasse bedeutet, dass nur statische Mitglieder aussetzen und kann nicht instanziiert werden
  • Auf einem Klassenmitglied, das, daß das Element bedeutet, kann, ohne genannt werden, um die Klasse instanziieren.
  • Auf einem Konstruktor, was bedeutet, dass der statische Konstruktor und wird immer vor einem statischen aufgerufen Mitglied genannt wird. (Das sind meist Performance-Engpässe und daher nicht empfohlen)

Hoffe, das hilft.

In C # es ziemlich immer bedeutet:. „Bezogen auf eine Art eher als eine Instanz des Typs“

Python hat den Dekorateur @staticmethod, die zu einer Klasse Mitglied angewandt, wenn die Methode für die Klasse zur Verfügung stellt, anstatt Instanzen und gibt keine automatischen Argumente an die Methode. Der @classmethod Dekorateur führt eine ähnliche Funktion, sondern geht die Klasse als erstes Argument, es viel nützlicher zu machen.

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

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

Wenn es in einer Funktion, dann statisch weist ihn vorab diese Variable im Datenteil der binären, anstatt auf dem Stapel zur Laufzeit.

In VB.NET statischem Verfahren Ebene verwendet wird, um die Variable zu bedeuten, mit allen Ausführungen des Verfahrens verbunden ist (es ist von Anruf erhalten zu nennen). Das ist ein bisschen eine obskure Verwendung in einer objektorientierten Anwendung though.

Das Gegenstück ist „Shared“, was bedeutet, das Verfahren oder Mitglied ist Typ-Ebene (Sie keine Instanz müssen sie zuzugreifen).

Wikipedia fasst viele verschiedene Bedeutungen von static:

Statische Methoden , statische Variablen , statische Typisierung .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top