Quelle est la différence de signification du mot clé static entre c et c ++?

Je sais que le mot clé en c a deux utilisations:

et en c ++, à côté de l’usage en c, static sert également à modifier le membre data et le membre function de la classe. Cette utilisation limitée du membre appartiennent à la classe au lieu des objects de la classe.

Je veux savoir s’il y a autre chose d’utilisation de static dans c / c ++?

static est probablement le mot clé le plus surchargé qui prête à confusion en C et en C ++. Cela signifie différentes choses dans différents endroits.

  • Dans les fonctions, static est une classe de stockage , désignant les variables qui existent pour la durée de vie du programme. En disant

     void f() { static int i = 0; } 

    dit que la valeur de i sera préservée entre les appels à f() . Les autres classes de stockage sont l’ auto par défaut (attention toutefois au changement de signification en C ++ 11), extern et register , plus thread_local en C11 / C ++ 11.

  • Au niveau du fichier (ou de l’espace de noms en C ++), static est un spécificateur de liaison . Les fonctions et les variables marquées static de cette manière ont un lien interne et sont donc locales à l’unité de traduction en cours. Cela signifie qu’une fonction comme

      static int f() { return 3; } 

    ne peut être référencé que par d’autres fonctions dans le même fichier .c . Cette utilisation de static été déconseillée en C ++ 03 au profit d’espaces de noms non nommés. J’ai lu quelque part, il était à nouveau indéterminé en C ++ 11.

  • En C ++, appliqué à une fonction membre ou à une variable membre d’une classe, cela signifie que la fonction ou la variable n’a pas besoin d’une instance de classe pour être accessible. Il existe peu de différences entre les fonctions / variables membres “class static” et les fonctions / variables globales en termes d’implémentation, à l’exception du fait que les spécificateurs d’access aux classes C ++ s’appliquent aux membres.

  • Une dernière: en C99 (mais pas C ++), static peut être utilisé dans un paramètre de fonction de tableau, comme ceci:

     void f(int a[static 4]) { } 

    cela spécifie que le paramètre a doit être défini par un tableau entier de taille au moins égale à 4.

Je pense que c’est tout, mais laissez-moi savoir dans les commentaires s’il y en a que j’ai oublié!

Statique Dans la famille de langues C, une variable statique est une variable qui existe pour la durée de vie d’une unité de compilation (fichier source ou module). Une variable statique peut être déclarée à l’échelle du module et donc être accessible à toutes les fonctions définies dans le même fichier source. Il est impossible d’accéder directement à une telle variable statique à partir d’autres modules, mais l’API de module interne peut transmettre des pointeurs à des variables statiques et les modifier via des pointeurs. Une variable statique peut également être déclarée dans un corps de fonction, où les règles de scope habituelles s’appliquent. Une variable statique déclarée dans une fonction n’est initialisée que lorsque le module est initialisé (généralement lors du chargement de l’application) et conserve ses valeurs lors de plusieurs appels de la fonction contenant la définition.

En C ++, une variable statique peut également être membre d’une définition de classe. L’access à une variable membre statique est régi par les modificateurs d’access standard (privé, public, protégé), mais toutes les instances de cette classe partagent la même variable statique et partagent la même valeur. La modification de la valeur de cette variable affecte tous les objects de la classe. VolatileLe mot clé volatile est quelque chose de tout à fait différent, et en aucun cas opposé à statique. Une variable statique peut ou non être déclarée volatile, tout comme une variable globale ou locale. Le mot clé volatile est un indice informant le compilateur que la valeur de la variable peut changer à l’insu du compilateur. Par conséquent, l’optimiseur de code du compilateur ne peut pas émettre d’hypothèses sur la valeur actuelle de la variable et doit toujours (re) lire le contenu de la variable.

En référence à c ++ -> Le mot-clé static peut être utilisé pour déclarer des variables, des fonctions, des membres de données de classe et des fonctions de classe.

Voici les utilisations courantes dans différents scénarios ( réf. À partir de MSDN )

  • Lorsque vous déclarez une variable ou une fonction au niveau du fichier (scope globale et / ou d’espace de nom), le mot-clé static spécifie que la variable ou la fonction possède une liaison interne. Lorsque vous déclarez une variable, la variable a une durée statique et le compilateur l’initialise à 0 sauf si vous spécifiez une autre valeur.

  • Lorsque vous déclarez une variable dans une fonction, le mot-clé static indique que la variable conserve son état entre les appels à cette fonction.

  • Lorsque vous déclarez un membre de données dans une déclaration de classe, le mot-clé static spécifie qu’une copie du membre est partagée par toutes les instances de la classe. Un membre de données statique doit être défini à la scope du fichier. Un membre de données intégral que vous déclarez comme const statique peut avoir un initialiseur.

  • Lorsque vous déclarez une fonction membre dans une déclaration de classe, le mot-clé static spécifie que la fonction est partagée par toutes les instances de la classe. Une fonction membre statique ne peut pas accéder à un membre d’instance car la fonction n’a pas implicitement ce pointeur. Pour accéder à un membre d’instance, déclarez la fonction avec un paramètre qui est un pointeur ou une référence d’instance.

  • Vous ne pouvez pas déclarer les membres d’un syndicat comme statiques. Cependant, une union anonyme déclarée globalement doit être explicitement déclarée statique.

vérifiez également les points suivants:
Le mot clé static et ses diverses utilisations en C ++

utilisation statique des mots clés