Question

J'ai entendu dire qu'il existe des différences entre les langages concernant la signification du mot clé statique , mais je n'ai pas trouvé de bonne liste qui consolide ces différences.

Voici ce que je sais de la signification de statique en C ++:

  • Pour les variables statiques locales dans une fonction, la variable est initialisée au démarrage et la valeur est enregistrée lors d'appels de fonction.
  • Les membres de données statiques sont partagés entre toutes les instances d'une classe. En d'autres termes, il n'y a qu'une seule instance d'un membre de données statique. Les membres de données statiques doivent être initialisés à la portée du fichier.
  • Les fonctions membres statiques n'ont accès qu'aux membres statiques.
  • Dans le code récursif, un objet ou une variable statique a forcément le même état dans différentes instances d'un bloc de code.
  • Les objets statiques et les variables définies dans la portée du fichier ont uniquement un lien interne. Aucun autre fichier ne peut les utiliser.

Comment la signification de statique change-t-elle dans les autres langues?

Était-ce utile?

La solution

C

  • Le mot clé peut modifier le lien ou la durée (durée de vie) d'un objet.
  • Les variables sont toujours initialisées à 0
  • Les fonctions ont un lien interne.
  • Si déclaré dans l'étendue au niveau du fichier: les variables ont une liaison interne et une durée statique (c'est-à-dire tout au long du cycle de vie du programme)
  • Si déclaré dans la portée du bloc: les variables n'ont pas de lien mais une durée statique
  • Il peut y avoir plusieurs déclarations de la même variable statique dans une unité de traduction. Cependant, notez qu'ils doivent être les mêmes. E.g: au niveau du fichier:
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 ++

  • Au niveau du fichier, l'utilisation est déconseillée pour les variables et les membres au profit d'espaces de noms anonymes. Existe uniquement en tant que compatibilité
  • Les variables sont toujours initialisées par défaut (comme dans C) à 0
  • "6.7 L'initialisation zéro (8.5) de tous les objets locaux avec une durée de stockage statique (3.7.1) ou une durée de stockage de thread (3.7.2) est effectuée avant toute autre initialisation [... ] "
  • Les variables ont une durée de stockage statique à moins d'être accompagnées d'un spécificateur thread_local (à partir de C ++ 0x)
  • Il ne peut y avoir qu'une seule définition d'un statique dans une unité de traduction
  • Les variables / fonctions membres signifient qu'il s'agit des propriétés de la classe et non des instances Syntaxe d'accès légal: instance.property ou Class :: property
  • Les fonctions membres statiques peuvent uniquement accéder aux variables membres statiques. Pas de ce pointeur pour de telles fonctions
  • Les membres non statiques peuvent toutefois accéder à n’importe quel membre statique
  • Au niveau du fichier, les objets ont un lien interne, à l'exception des membres de la classe qui ont une portée de classe
  • Les membres de classe doivent être définis dans la déclaration de classe ou en dehors de manière explicite via l'opérateur de résolution de nom de classe et de portée
  • Impossible d'utiliser this dans une méthode statique

ActionScript

  • Méthodes de classe comme en C ++
  • ne peut pas utiliser this ou super dans une méthode statique
  • Uniquement accessible par nom de classe et non par nom d'instance
  • non hérité
  • Les classes dérivées ont toutefois accès aux propriétés statiques des bases
  • Les variables déclarées avec les mots clés static et const doivent être initialisées en même temps que vous déclarez la constante

Conception orientée objet

  • Le modèle de conception Singleton est considéré par beaucoup comme un objet statique glorifié
  • Utilisé dans le modèle de conception d'usine

J'ai peut-être manqué beaucoup d'autres choses - n'hésitez pas à participer.

Autres conseils

Dans Delphi, le mot clé static est utilisé exclusivement pour définir les méthodes de classe. Dans Delphi, une méthode de classe normale peut être déclarée virtuelle et remplacée dans une sous-classe. De plus, Delphi a une variable self , similaire au pointeur this dans d'autres langues. Cependant, dans une méthode de classe, le self pointe vers la classe dans laquelle la méthode est appelée à la place d'une instance.

Déclarer une méthode de classe static signifie:

  1. Il ne peut pas être remplacé dans une sous-classe
  2. Il n'a pas de pointeur self

Cela signifie qu'une méthode de classe statique ne peut accéder qu'aux membres de la classe dans la classe dans laquelle elle a été définie, alors qu'une méthode de classe normale peut accéder aux membres de la classe surchargés dans les classes dérivées.

Il existe d'autres utilisations informelles de static dans la documentation de Delphi, qui font généralement référence à une fonctionnalité non modifiable (s'agit-il d'un mot?). Par exemple, un tableau statique par rapport à un tableau dynamique. Toutes les méthodes d'instance dans Delphi sont statiques sauf indication contraire.

Dans VB.NET, une variable Static ressemble à une variable statique locale C ++.

Cependant, il n'y a pas de Static à l'échelle de la classe; utilisez plutôt Shared .

En C #, un mot clé statique peut être utilisé de 3 manières:

  • Sur la définition de classe, ce qui signifie que la classe n'expose que les membres statiques et ne peut pas être instanciée
  • Sur un membre de la classe, ce qui signifie que le membre peut être appelé sans avoir à instancier la classe.
  • Sur un constructeur, ce qui signifie que le constructeur statique sera toujours appelé avant qu'un membre statique soit appelé. (Il s’agit principalement de goulots d’étranglement liés aux performances et, par conséquent, non recommandés.)

J'espère que ça aide.

En C #, cela signifie presque toujours: "lié à un type plutôt qu’à une instance du type".

Python a le décorateur @staticmethod qui, lorsqu'il est appliqué à un membre de la classe, rend la méthode disponible sur la classe plutôt que sur les occurrences et ne transmet aucun argument automatique à la méthode. Le décorateur @classmethod remplit une fonction similaire, mais transmet la classe en tant que premier argument, ce qui le rend beaucoup plus utile.

En C, statique marque une fonction ou une variable globale comme locale du fichier dans lequel elle se trouve.

C'est un peu comme privé dans d'autres langues. Sorta.

S'il s'agit d'une fonction, alors une variable statique préalloue cette variable dans la section de données du fichier binaire, plutôt que sur la pile au moment de l'exécution.

Dans VB.NET, statique est utilisé au niveau procédure pour indiquer que la variable est associée à toutes les exécutions de la procédure (elle est préservée d’appel à appel). C’est un peu une utilisation arcanique dans une application orientée objet.

La contrepartie est " partagée " ce qui signifie que la méthode ou le membre est de type (vous n'avez pas besoin d'une instance pour y accéder).

Wikipedia résume de nombreuses significations différentes de static :

Méthodes statiques , variables statiques , saisie statique .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top