Je sais que le mot clé en c a deux utilisations:
modifier les variables
modifier les variables globales
cette utilisation a limité la scope de la plage de variables globales à partir du point défini à la fin du fichier.
modifier les variables locales
cet usage limite la scope de la variable locale dans la fonction définie, mais rest également dans la zone statique de la mémoire
modifier les fonctions
ce moyen ne peut invoquer que la fonction dans le fichier défini.
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